2012-03-16 14 views
7

私はC++の初心者です。特にオブジェクト指向プログラミングについて学んでいます。そして、今私は学習中に問題があります。仮想継承のコンストラクタの順序

次のクラス階層があります:

class Class{}; 

class Base:public Class{}; 

class Derived1:virtual public Base{}; 

class Derived2:virtual public Base{}; 

class MI:public Derived1,public Derived2{}; 

class Final:public MI,public Class{}; 

そして今、私は最終的なクラスオブジェクトの定義のコンストラクタの順序が何であるかを知りたいです。

私は図を描く:私は仮想基底クラスは、常に関係なく、継承階層に表示される場所の前に非仮想基底クラスに構築されている知っている enter image description here structure of class inheritance http://hi.csdn.net/attachment/201203/16/2712336_1331902452BziD.jpg

を。私が混乱しているのは、ClassクラスのコンストラクタがBaseの前にあり、かつClassのコンストラクタが2回呼び出された場合です。なぜ?

誰かが私の答えを教えてくれますか?より詳細に、より良い。

+7

怠け者のように理解するのはかなり簡単です。プログラムを構築する。あなたの各コンストラクタ(.e.g "I'm Base Constructor!")にdebug coutステートメントを入れてください。 coutステートメントに従って、構築の順序を観察します。 –

+3

警告:あいまいさのために 'Final'で直接' Class'アクセスできない –

+0

@ 0A0D:もちろん、コンパイラがどのようにそれを実装しているのかが分かります。それはあなたには十分に良いかもしれませんが、そうではないかもしれません。 :) –

答えて

8

FinalBaseによってClassの直接継承はvirtualないので、Finalのインスタンスは種類Class2つの基本クラスのサブオブジェクトを有しています。 Baseの直接基底はBaseの前に構築され、Finalの直接基底は後で(実際にはMIの後に)構築されます。 (彼らはすでに構築された仮想基盤のない限り)

  1. 直接塩基は
  2. 塩基は、クラスの前に構築され、それらが列挙されている順序に構成されています。

    理由は、ということです自身のコンストラクタが実行されます。

Finalを適用すると、MIの後にClassが作成されます。 (2)を数回適用すると、Baseの前に、Derived1Derived2の前に、MIの前にClassが構築されていることがわかります。