子类构造和析构被执行时是否调用父类以及调用顺序

来源:互联网 发布:网络推广代理公司 编辑:程序博客网 时间:2024/04/30 17:24

子类构造和析构被执行时是否调用父类以及调用顺序



子类被构造的时候回先调用父类的构造函数
子类析构的 时候先析构子类后析构父类
如果直接用子类构造一个父类的对象,删除这个父类的对象不会调用子类的析构函数(父类的析构函数为虚函数除外)


示例代码:

//A是一个父类 , 析构函数不是虚函数class A{public: A(){cout << " A constructor" << endl;}  ~A(){cout << " A destructor" << endl;}};//B是A的子类class B : public A{public:B(){cout << " B constructor" << endl;}~B(){cout << " B destructor" << endl;}};//C是一个父类 , 析构函数是虚函数class C{public:C(){cout << " C constructor" << endl;}virtual ~C(){cout << " C destructor" << endl;}};//D是C的子类class D : public C{public:D(){cout << " D constructor" << endl;}~D(){cout << " D destructor" << endl;}};

测试程序

A *a = new B();delete a;cout << "-----------------------------" << endl<<endl;B * b = new B();delete b;cout << "-----------------------------" << endl << endl;C *c = new D();delete c;

先分析下输出的顺序
A *a = new B();//用子类B构造一个父类A的对象 先调用父类A的构造方法,然后调用子类B的构造方法
delete a;//删除父类,这时候由于A的析构函数不是虚函数,所以直接调用父类A的构造方法,不会调用子类B的构造方法
cout << "-----------------------------" << endl<<endl;
B * b = new B();//先调用父类A的构造方法,然后调用子类B的构造方法
delete b;//删除子类,这时候会先调用子类B的析构函数,再调用父类A的析构函数
cout << "-----------------------------" << endl << endl;
C *c = new D();//同理,先调用父类C的构造方法,然后调用子类D的构造方法
delete c;//删除父类,这时候由于A的析构函数是虚函数,所以直接先调用子类D的析构函数,再调用父类C的构造方法

运行结果:





昨天面试的时候面试官出了道此知识点的小题,说难倒了好多人,当时信心满满的写出了答案,还解释了一通,结果错了 (尴了个尬) 

0 0
原创粉丝点击