継承体系の下のオブジェクトの構造と解構——《Inside The C++Object Model》の3

2192 ワード

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が呼び出されます.
    解构の顺番は构造の顺番と逆!
    以下に、検証の例を示します.
    #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