仮想継承におけるデフォルト コンストラクターの呼び出し
C の継承メカニズムである仮想継承は、ダイヤモンド継承または反復継承の問題を解決することを目的としています。この文脈では、派生クラス オブジェクトをインスタンス化するときに仮想基本クラスのデフォルト コンストラクターが呼び出されるのはなぜですか?
この動作は、仮想継承の設計に起因します。基本クラスのコンストラクターが初期化リストを介して派生クラスのコンストラクターによって呼び出される従来の継承とは異なり、仮想継承では、最も派生したクラスのコンストラクターが仮想基本クラスのコンストラクターを直接呼び出します。
提供される例:
class grandmother { public: grandmother() { std::cout << "grandmother (default)" << std::endl; } grandmother(int attr) { std::cout << "grandmother: " << attr << std::endl; } }; class mother: virtual public grandmother { public: mother(int attr) : grandmother(attr) { std::cout << "mother: " << attr << std::endl; } }; class daughter: virtual public mother { public: daughter(int attr) : mother(attr) { std::cout << "daughter: " << attr << std::endl; } };
娘型のオブジェクトをインスタンス化する場合、娘コンストラクターは直接祖母コンストラクターを呼び出します。ただし、娘コンストラクターの初期化リストでは特定のコンストラクターが呼び出されないため、デフォルトで祖母のデフォルト コンストラクターが呼び出されます。
目的のコンストラクターを明示的に呼び出すには、娘コンストラクターの初期化リストを変更する必要があります。 to:
daughter(int attr) : grandmother(attr), mother(attr) { ... }
これにより、祖母の正しいコンストラクターが呼び出され、出力には次が含まれます。 line:
grandmother: 0
仮想継承を使用する場合、適切な初期化とオブジェクトの構築が確実に行われるため、この動作を理解することが重要です。
以上が派生クラス オブジェクトがインスタンス化されるときに、仮想基本クラスのデフォルト コンストラクターが呼び出されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。