継承体系の下のオブジェクトの構造と解構——《Inside The C++Object Model》の3
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が多重継承システムの下で2番目または後続の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 initialization listに1つのmemberが現れない場合、しかしdefault constructorがあり、default constructorが呼び出されます.
解构の顺番は构造の顺番と逆!
以下に、検証の例を示します.
VC 6の出力結果は以下の通りである.
2前のレイヤのbase class constructorは、base class宣言の順序で呼び出される必要があります.
3 class objectにvirtual table pointer(s)がある場合、これらのpointer(s)は初期値を設定する必要があり、適切なvirtual table(s)4を指してmember initialization listに記録されたdata member初期化操作がconstructorに格納され、membersの宣言順に5 member initialization listに1つのmemberが現れない場合、しかし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;
};
void main(){
D d;
}
VC 6の出力結果は以下の通りである.
Base ctor
B ctor
A ctor
C ctor
X ctor
D ctor
D dtor
X dtor
C dtor
A dtor
B dtor
Base dtor