继承体系下的对象构造与解构——《Inside The C++ Object Model》之三
1 所有virtual base class constructor必须被调用,从左到右,从最深到最浅:[*]如果class 被列于member initialization list中,那么如果有任何明确指定的参数,都应该传递过去,若没有列于list中,而class有一个default constructor,也应该调用之
[*]此外,class中的每一个virtual base class subobject 的偏移量(offset)必须在执行期可被存取
[*]如果class object是最底层(most-derived)的class,其constructor可能被调用;某些用以支持这个行为的机制必须被放进来
2 所有上一层的base class constructor必须被调用,以base class声明的顺序为序
[*]如果base class 被列于member initialization list中,那么任何明确指定的参数都应该传递过去
[*]如果base class 没有被列于member initialization list中,而它有default constructor(或有default memberwise copy constructor),那么就调用之
[*]如果base class 是多重继承体系下的第二或者后继的base class,那么this指针必须有所调整
3 如果class object有virtual table pointer(s),这些pointer(s)必须被设定初值,指向适当的virtual table(s)
4 记录在member initialization list中的data member初始化操作会被放进constructor中,并以members的声明顺序为顺序
5 如果有一个member没有出现在member initialization list中,但是它有一个default constructor,那么该default constructor被调用
解构的顺序与构造顺序相反!
以下是一个验证的例子
#include <iostream> using namespace std; class Base{public:Base(){cout<<"Base ctor"<<endl;}~Base(){cout<<"Base dtor"<<endl;}};class B{public:B(){cout<<"B ctor"<<endl;}~B(){cout<<"B dtor"<<endl;}};class C:public virtual Base{public:C(){cout<<"C ctor"<<endl;}~C(){cout<<"C dtor"<<endl;}};class A{public:A(){cout<<"A ctor"<<endl;}~A(){cout<<"A dtor"<<endl;}};class X{public:X(){cout<<"X ctor"<<endl;}~X(){cout<<"X dtor"<<endl;}};class D:public A, public C,public virtual B{public:D(){cout<<"D ctor"<<endl<<endl;}~D(){cout<<"D dtor"<<endl;}virtual void fun(){}X x;};voidmain(){ D d;} VC6的输出结果如下:
Base ctorB ctorA ctorC ctorX ctorD ctorD dtorX dtorC dtorA dtorB dtorBase dtor
页:
[1]