2013-06-29 15 views
7

は、次のコードを見てみましょう:仮想基底クラスは、C++で空のコンストラクタを呼び出します(C++ 11)

class A{ 
protected: 
    int _val; 
public: 
    A(){printf("calling A empty constructor\n");} 
    A(int val):_val(val){printf("calling A constructor (%d)\n", val);} 
}; 

class B: virtual public A{ 
public: 
    B(){printf("calling B empty constructor\n");} 
    B(int val):A(val){printf("calling B constructor (%d)\n", val);} 
}; 

class C: public B{ 
public: 
    C(){printf("calling C empty constructor\n");} 
    C(int val):B(val){printf("calling C constructor (%d)\n", val);} 
}; 

int main(void) { 
    C test(2); 
} 

出力されています:

calling A empty constructor 
calling B constructor (2) 
calling C constructor (2) 

なぜAクラス誰かが私に説明してもらえコンストラクタは引数なしで呼び出されますか? 追加BクラスがAから実質的に継承されるようにするには、この動作を "修正"できますか? (継承が仮想でない場合 - サンプルは正常に動作します)

+0

[仮想継承でコンストラクタ呼び出しの順序]の可能複製(http://stackoverflow.com/questions/10534228/order-of-constructor-call-in-virtual-inheritance) –

+1

はこれをしていません議論されて死んでいる? –

+0

継承のキーワード 'virtual'は常に、基本クラスが継承ツリーに複数回表示されるという推論に基づいて、宣言でデフォルト以外のコンストラクタを指定した場合でも、コンストラクタが基本クラスのデフォルトコンストラクタを呼び出しますあなたはコンストラクタが一度呼び出されるだけです。また、仮想継承のデフォルトコンストラクタは、指定した順序にかかわらず、通常継承の前に呼び出されます。 – Immueggpain

答えて

10

C++ 03では同じです。

仮想ベースコンストラクタは、常に最終リーフクラスから呼び出されます。 Cをインスタンス化するときに、Aのデフォルトのコンストラクタ以外のものを必要とする場合は、Cクラスのコンストラクタでもそれを指定する必要があります。

C(int val): A(val), B(val) {printf("calling C constructor (%d)\n", val);} 
関連する問題