仮想継承でデフォルト コンストラクターが呼び出されるのはなぜですか?
仮想継承を使用して娘クラスの新しいオブジェクトを作成する場合、デフォルト コンストラクターは祖母クラスが予期せず呼び出されます。ユーザーが引数を使用してマザークラスのコンストラクターを明示的に呼び出すことを考えると、この動作は直観に反しているように見えるかもしれません。
説明:
仮想継承では、仮想ベースのコンストラクターclass は、最も派生したクラスのコンストラクターによって直接呼び出されます。指定されたコードでは、娘クラスが最も派生したクラスであるため、祖母コンストラクターを直接呼び出します。
娘クラスは初期化リストで祖母コンストラクターに引数を提供しないため、デフォルト祖母クラスのコンストラクターが自動的に呼び出されます。これは、デフォルトでは、コンパイラーは、特定のコンストラクターが呼び出されない場合にはデフォルトのコンストラクターが使用されると想定するためです。
解決策:
必要な祖母コンストラクターを呼び出すには引数を使用する場合は、娘クラス コンストラクターの初期化リストを明示的に更新する必要があります。正しいコードは次のとおりです:
daughter(int attr) : grandmother(attr), mother(attr) { ... }
これにより、指定された引数を使用して祖母コンストラクターが確実に呼び出されます。あるいは、祖母クラスは引数を受け入れるデフォルトのコンストラクターを提供できます。
以上がGrandmother クラスのデフォルト コンストラクターが仮想継承で呼び出されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。