- 在派⽣类构造函数中,所有的虚基类及上⼀层基类的构造函数调⽤;
- 对象的 vptr 被初始化;
- 如果有成员初始化列表,将在构造函数体内扩展开来,这必须在 vptr 被设定之后才做;
- 执⾏程序员所提供的代码;
- 记录在成员初始化列表中的数据成员初始化操作会被放在构造函数的函数体内,并与成员的声明顺序为顺序;
- 如果⼀个成员并没有出现在成员初始化列表中,但它有⼀个默认构造函数,那么默认构造函数必须被调⽤;
- 如果 class 有虚表,那么它必须被设定初值;
- 所有上⼀层的基类构造函数必须被调⽤;
- 所有虚基类的构造函数必须被调⽤
- 析构函数函数体被执⾏;
- 如果 class 拥有成员类对象,⽽后者拥有析构函数,那么它们会以其声明顺序的相反顺序被调⽤;
- 如果对象有⼀个 vptr,现在被重新定义
- 如果有任何直接的上⼀层⾮虚基类拥有析构函数,则它们会以声明顺序被调⽤;
- 如果任何虚基类拥有析构函数
例子:
#includeusing namespace std; class OBJ1 { public: OBJ1(){ cout <<"OBJ1n"; } }; class OBJ2 { public: OBJ2(){ cout <<"OBJ2n"; } }; class Base1 { public: Base1(){ cout <<"Base1n"; } }; class Base2 { public: Base2(){ cout <<"Base2n"; } }; class Base3 { public: Base3(){ cout <<"Base3n"; } }; class Base4 { public: Base4(){ cout <<"Base4n"; } }; class Derived :public Base1, virtual public Base2, public Base3, virtual public Base4 { public: Derived() :Base4(), Base3(), Base2(), Base1(), obj2(), obj1() { cout <<"Derived ok.n"; } protected: OBJ1 obj1; OBJ2 obj2; }; int main() { Derived aa; cout <<"This is ok.n"; int i; cin >> i; return 0; }
结果:
Base2 Base4 Base1 Base3 OBJ1 OBJ2 Derived ok. This is ok.



