仮想継承とコンストラクターの初期化
仮想継承は、多重継承の曖昧さを解決するために C で使用される手法です。クラスが同じメンバーを持つ複数の基本クラスから継承する場合、仮想継承により、そのメンバーのコピーが 1 つだけ作成されるようになり、メモリのオーバーヘッドが削減されます。
ただし、仮想継承では、そのような場合に特有の状況が発生します。コンストラクターの初期化まで。この例では、Base、A、B の 3 つのクラスがあり、A と B は両方とも Base から仮想的に継承しています。次に、クラス C は A と B の両方から継承します。
問題
クラス C のコンストラクターで、Base の初期化中にエラーが発生します。 C は Base から直接継承していないため、コンパイラは Base() への関数呼び出しを照合できません。では、なぜこのエラーが発生するのでしょうか?
仮想基本クラスの初期化について
仮想基本クラスには、非仮想基本クラスとは異なる初期化プロセスがあります。仮想基本クラスが継承されると、それを初期化するのは最も派生したクラスの責任になります。この場合、クラス C は最も派生したクラスであり、仮想基本クラス Base を初期化する必要があります。
Base には C の直接インスタンスがないため、A または B コンストラクターを使用して初期化することはできません。代わりに、Base はデフォルトのコンストラクターを使用して初期化する必要があります。ただし、提供されるコードには Base のデフォルト コンストラクターが含まれていません。
解決策
この問題を解決するには、Base クラスでデフォルト コンストラクターを定義する必要があります。
このデフォルトのコンストラクターは、クラス C の Base 仮想メンバー変数を初期化するために使用されます。
以上がC で仮想継承によりコンストラクター初期化エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。