2017-08-10 17 views
3

私は論理的に答えられない質問があります。なぜ私は、次のコードを実行した後、それを次のとおりです。継承共有メモリ

class foo1 
{ 
private: 
    int age; 
public: 
    foo1(int _age) :age(_age) {} 
    void print() { std::cout << age << std::endl; } 
}; 

class foo2 :virtual public foo1 
{ 
    int grade; 
public: 
    foo2(int _age, int _grade) :foo1(_age), grade(_grade) {} 
}; 


class foo3 :virtual public foo2 
{ 
private: 
    int score; 
public: 
    foo3(int _age, int _grade, int _score) : 
      foo1(_age), foo2(5000, _grade), score(_score) {} 
}; 

int main() 
{ 
    foo3 k(77,2,3); 
    k.print(); 
} 

コンソール出力は、(私が間違っている)5000は、右の出力をだろうと思っための私の理由は、我々は、私が使用している場合ということである77、ではなく5000です。 foo3以下のコンストラクタの初期化子リストが起こる:

1)foo1ののコンストラクタはfoo2はのコンストラクタは5000に年齢を設定し、その後77

2)の年齢と2のグレードを設定しますなぜなら、foo2はfoo1のコンストラクタを使用しているからです。

なぜfoo2はのコンストラクタは、事実上、継承されたクラスのコンストラクタは、常に最も派生クラスによって呼び出されfoo1の

+1

共有メモリはどこにありますか? –

+2

興味深い質問ですが、実際のアプリケーションではこのコードを使用しないことを祈っています。 – Tim510

答えて

5

コンストラクタで設定値を変更しません。あなたの場合はそれはfoo3です。 foo2のfoo1のコンストラクタ呼び出しはスキップされます。