仮想継承とデフォルト コンストラクターの呼び出し
仮想継承を含む継承階層では、仮想基本クラスのデフォルト コンストラクターが予期せず呼び出される可能性があります。 。次のコードを考えてみましょう。
class grandmother { public: grandmother() { // Default constructor std::cout << "grandmother (default)" << std::endl; } grandmother(int attr) { // Parameterized constructor 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; } }; int main() { daughter x(0); }
娘クラスのインスタンスが作成されると、出力は次のようになります。
grandmother (default) mother: 0 daughter: 0
祖母クラスにパラメータ化されたコンストラクターが存在するにもかかわらず、デフォルトのコンストラクターが呼び出されます。なぜこのようなことが起こるのでしょうか?
仮想基本クラス コンストラクターの呼び出し
仮想継承では、仮想基本クラスのコンストラクターは、最も派生したクラスのコンストラクターによって直接呼び出されます。この場合、娘コンストラクターは祖母コンストラクターを直接呼び出します。
母クラスは初期化リストで祖母コンストラクターを明示的に呼び出していないため、デフォルトのコンストラクターが使用されます。目的のコンストラクターを正しく呼び出すには、娘コンストラクターを次のように変更する必要があります。
daughter(int attr) : grandmother(attr), mother(attr) { ... }
初期化リストで祖母(attr) コンストラクターを明示的に呼び出すことで、正しいコンストラクターが使用され、出力は次のようになります。
grandmother: 0 mother: 0 daughter: 0
以上が仮想基底クラスのデフォルトのコンストラクターが仮想継承階層で呼び出されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。