在面试的时候经常提问的一个问题是,一个类继承自另一个类,构造函数的调用顺序是什么样的,这里直接写个demo验证一下:
代码
// 来验证一下调用构造函数的顺序
#include <iostream>
using namespace std;
class base
{
public:
base()
{
cout << "调用基类的构造函数" << endl;
}
virtual ~base()
{
cout << "调用基类的析构函数" << endl;
}
};
class B
{
public:
B()
{
cout << "调用class B的构造函数" << endl;
}
~B()
{
cout << "调用class B的析构函数" << endl;
}
};
class A : public base
{
public:
A()
{
cout << "调用class A的构造函数" << endl;
}
~A()
{
cout << "调用class A的析构函数" << endl;
}
private:
B b;
};
int main()
{
base *a = new A();
delete a;
return 0;
}
程序输出
调用基类的构造函数
调用class B的构造函数
调用class A的构造函数
调用class A的析构函数
调用class B的析构函数
调用基类的析构函数
结论
- 调用基类的构造函数
- 调用类内成员对象的构造函数
- 调用派生类的构造函数
- 调用派生类的析构函数
- 调用类内成员对象的析构函数
- 调用基类的析构函数
注意
基类的析构函数应该用virtual修饰,不然的话程序输出如下,也就是说派生类的析构函数是没有被调用的。同样的派生类中的成员对象也没有被析构。
这种问题出现在删除指向派生类的基类指针的时候,如果我们改成
A*a = new A();
delete a;
则能够正常的析构。
调用基类的构造函数
调用class B的构造函数
调用class A的构造函数
调用基类的析构函数