私は、純粋仮想関数と仮想(非純粋)デストラクタのみを定義する多くの抽象クラスを使用しています。
仮想継承を使用せずにダイヤモンド継承構造を使用しても問題ありませんか?(一部のプログラマーが仮想継承を使用する必要があることを知らなくても、問題がないことを確認したいと思います。)このトピックの短いが完全な概要を提供する優れたリソースは何ですか?
ありがとう!
私は、純粋仮想関数と仮想(非純粋)デストラクタのみを定義する多くの抽象クラスを使用しています。
仮想継承を使用せずにダイヤモンド継承構造を使用しても問題ありませんか?(一部のプログラマーが仮想継承を使用する必要があることを知らなくても、問題がないことを確認したいと思います。)このトピックの短いが完全な概要を提供する優れたリソースは何ですか?
ありがとう!
できません。仮想継承がなければ、継承グラフは単なるひし形ではありません。Derived
とを継承しLeft
、Right
両方が非仮想的にから派生する場合、オブジェクトごとBase
に2つのサブオブジェクトが存在します。Base
Derived
仮想継承は、ダイアモンドを取得するメカニズムです。仮想継承を使用しない場合は、共通の基本クラスの2つの異なるコピーが作成されます。これは、実際にはダイアモンドではなく、おそらく必要なものではありません。
このFAQは、例を使用して多重継承に対する適切な回答を提供します。
ダイヤモンドの場合、仮想継承が必要です。