子类构造和析构被执行时是否调用父类以及调用顺序
来源:互联网 发布:网络推广代理公司 编辑:程序博客网 时间: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的构造方法
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
- 子类构造和析构被执行时是否调用父类以及调用顺序
- 子类父类构造函数调用顺序
- 调用子类构造器来初始化子类对象时,父类构造器会在子类构造器之前执行
- C++子类构造和析构被时,父类构造和析构的调用顺序
- c++ 子类父类 的构造函数调用顺序
- c++中 子类父类的构造函数调用顺序
- 关于父类与子类的构造函数调用顺序
- c++ 子类父类 的构造函数调用顺序
- php子类是否自动调用父类构造函数
- 子类调用父类构造函数和析构函数的顺序
- 子类调用父类构造和析构函数的顺序
- C++ 子类调用父类构造和析构函数的顺序
- c++ 中子类与父类构造析构的调用和顺序
- 子类调用父类构造器时的Java类成员初始化顺序
- 子类父类调用的执行顺序及代码块的执行顺序
- 子类,父类静态代码块,构造代码块,以及构造函数执行顺序
- java构造函数是否可继承,以及子类构造函数可否不使用super调用超类构造函数
- java构造函数是否可继承,以及子类构造函数可否不使用super调用超类构造函数
- 创建第一个node,express,ejs网站详细介绍
- 2016/08/20 接口
- maven入门基础知识
- Linux服务器使用情况简单介绍
- Top K Frequent Elements
- 子类构造和析构被执行时是否调用父类以及调用顺序
- 化学盐
- HDU5091->线段树维护区间覆盖次数&&扫描线
- 时滞微分方程求解之三ddesd--变时滞
- kxmovie源码详解
- 0-1背包问题
- iOS 杂烩
- 《C++ Primer》读书笔记-IO流操作
- 在模拟器上安装APK文件的方法