2012-03-28 6 views
62

次のコードで、タイプdaughterのオブジェクトをインスタンス化すると、デフォルトのgrandmother()コンストラクタが呼び出されるのはなぜですか?デフォルトのコンストラクタが仮想継承で呼び出されるのはなぜですか?

私はgrandmother(int)コンストラクタを呼び出す必要があります(私のmotherクラスコンストラクタの仕様に従う)か、このコードは仮想継承のためにまったくコンパイルすべきではないと考えました。

ここでコンパイラは暗黙のうちにgrandmotherのデフォルトのコンストラクタを私の背中に呼び出しますが、私は決してそれを求めませんでした。

+0

どのコンパイラ(およびバージョン)ですか?どのような議論をしてコンパイルしましたか? – orlp

+0

gcc 4.6.3 20120306(Red Hat 4.6.3-2)(fedora 15の場合)引数は次のとおりです。引数:-O0 -g3 -Wall -c -fmessage-length = 0 –

+0

g ++ 4.1.2には同じ問題があります。http:// codepad.org/L0jBXfSP – orlp

答えて

66

仮想継承を使用する場合、仮想基本クラスのコンストラクタは、最も派生したクラスのコンストラクタによって直接呼び出されます。この場合、daughterコンストラクタはgrandmotherコンストラクタを直接呼び出します。

grandmotherコンストラクタを初期化リストに明示的に呼び出さなかったため、デフォルトのコンストラクタが呼び出されます。正しいコンストラクタを呼び出すには、This FAQ entryを参照してください。

+2

それはまったく意味があります、ありがとう!階層内のすべてのコンストラクタは、それぞれの子クラスではなく、最後のクラスから呼び出されます。決してそれを考えなかった。 C++仕様はときどき扱いにくいかもしれません... –

+0

ありがとう!仮想継承の場合は、チェーンのすべてのコンストラクタを手動で呼び出すことをお勧めします。 –

+0

優秀な答え!どうも! –

関連する問題