2011-01-14 7 views
0

私は、純粋仮想関数と仮想(非純粋)デストラクタだけを定義する多くの抽象クラスを使用しています。ダイヤモンドのインタフェースに関する問題

仮想継承を使用せずにダイアモンドの継承構造を使用することはできますか? (私はいくつかのプログラマーが仮想継承を使うべきかどうか分からなくても問題がないことを確認したいと思っています)この話題の短いしかし完全な概観を与えるよい資源は何ですか?

ありがとうございます!

答えて

5

できません。仮想継承がなければ、継承グラフはちょうどダイヤモンドではありません。 DerivedLeftおよびRightから継承し、どちらもBaseから実質的に派生しない場合は、オブジェクトあたり2つのサブオブジェクトが存在します。

+0

Baseに純粋な仮想メソッドしかない場合はどうなりますか? – Philipp

+0

あなたはまだ2部持っています。つまり、 'Derived * 'のキャストから2つの異なる' Base *'値を得ることができます。そして、共通のvtableの実装を考えてみましょう。両方の 'Base'オブジェクトにはそれぞれ独自のvptrがあります。 – MSalters

5

仮想継承は、仮想継承を使用しない場合、共通基底クラスの2つの異なるコピー - ダイヤモンドではなく、おそらくあなたが望むものではない - 。

2

This faqは、例を使用して複数の継承に対して良好な回答を提供します。

ダイヤモンドの場合、仮想継承が必要です。

+0

リンクありがとう!なぜそれがdownvotedされたか分からない! – Philipp