2012-01-28 17 views
6

このコードがあります:このプログラムの実行後基底クラスの複数の仮想継承とコンストラクタ呼び出し

#include <iostream> 

class Bazowa 
{ 
    int x; 
public: 
    Bazowa() : x(55){} 
    Bazowa(int x_) : x(x_) {} 
    void fun() 
    { 
     std::cout << x << "fun\n"; 
    } 
}; 

class Pochodna1 : virtual public Bazowa 
{ 
public: 
    Pochodna1() : Bazowa(101) {} 
}; 

class Pochodna2 : virtual public Bazowa 
{ 
public: 
    Pochodna2() : Bazowa(103) {} 
}; 

class SuperPochodna : public Pochodna1, public Pochodna2 
{ 
public: 
    SuperPochodna() : {} 
}; 


int main() { 
    SuperPochodna sp; 
    sp.fun();  // prints 55fun 

    return 0; 
} 

は、それが「55fun」を出力します。 Pochodna1とPochodna2クラスのコンストラクタ呼び出しで何が起こったのですか?無視されますか? Bazowaクラスのメンバー 'x'が '55'に設定されていて、 '101'や '103'に設定されていないのはなぜですか?

答えて

9

仮想ベースコンストラクタは、常に最終リーフクラスから呼び出されます。仮想ベースの他のコンストラクタは呼び出されません。あなたのケースでは、SuperPochodna()Bazowa()と呼ばれ、Bazowa(int)へのコールはPochodna1Pochodna2には使用されません。

http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.14またはGoogleの「仮想ベースのコンストラクタ」を参照してください。

+0

標準の関連ビット(ドラフトN3290)は12.6.2:10-11であり、これにもこのような例があります。 – user450018

関連する問題