devried class对象内的base class成分会在derived class自身成分被构造之前先构造妥当。
由于base class构造函数的执行更早于dervied class构造函数,当base class构造函数执行时dervied class的成员变量尚未初始化。如果此期间调用的
virtual函数下降至dervied class阶层,要知道dervied class的函数几乎必然取用local成员变量,而那些成员变量尚未初始化。
确定你的构造函数和析构函数都没有(在对象创建和销毁期间)调用virtual函数,而它们调用的所有函数都服从统一约束。
#include
using namespace std;
class Parent{
public:
Parent(){cout<<“Parent construct”<<endl;}
virtual ~Parent(){cout<<“Parent distruct”<<endl;}
};
class Son: public Parent{
public:
Son(){cout<<“Son construct”<<endl;}
~Son(){cout<<“Son disstruct”<<endl;}
};
int main()
{
Parent *p = new Son();
delete p;
cout << “Hello World”;
return 0;
}
输出:
Parent construct
Son construct
Son disstruct //如果父类的虚构函数是non-virtual,则不会有此输出,因为子类的析构函数不会被调用
Parent distruct
Hello World
构造函数的执行顺序:父类–>子类;
析构函数的执行顺序:子类–>父类。