2012-12-06 15 views
7

私は仮想継承の概念を理解し、私はこれのどこに答えを見つけることができませんでした。あなたはBとCは、事実上、Aの2つのインスタンスを避けるために、継承しかし、あなたはBとCの両方で仮想継承を指定しなければならないの作ることができるので、あなたはクラスBとC BとCの両方を継承クラスAを継承したクラスDを持っていると言います2つのうちの一方が事実上Aを継承し、もう一方が実質的に継承しない場合、Aのインスタンスを1つだけ作成していますか?仮想継承、1つのクラスは十分ですか?

おかげ

答えて

11

彼らはすべてのvirtualでなければなりません。 C++ 11 10.1 [class.mi]/7から:

クラス指定された型の両方の仮想および非仮想基本クラスを持つことができます。クラスAAの目的のため

class B { /* ... */ }; 
class X : virtual public B { /* ... */ }; 
class Y : virtual public B { /* ... */ }; 
class Z : public B { /* ... */ }; 
class AA : public X, public Y, public Z { /* ... */ }; 

、タイプAAのオブジェクト内の単一BサブオブジェクトにAA対応のクラス格子、および(非仮想の他のすべての出現における基底クラスBのすべての仮想オカレンスAAのクラス格子における)基本クラスBAAのオブジェクト内の別個Bサブオブジェクトと一対一に対応します。以下に示すように、ZBXYによって共有仮想B:クラスAAクラスB二サブオブジェクトを有し、クラス上記で定義AA与えられます。

virtual inheritance example

+0

、§10.1/ 4実際にこれを定義します。 –

+0

@sftrabbit:標準のコピーは何ですか? C++ 03では、 '10.1 [class.mi]/6'です。最新の利用可能な作業用紙N3485では、まだ '10.1 [class.mi]/7'です。私は '10.1 [class.mi]/4'で定義されている標準的なコピーを持っていません。 –

+0

私はいつも彼らがOPが頼んでいるものを許可しなかった理由を疑問に思ってきました。私は仮想子供が非仮想子供の親を指していることにいかなる論理的な障害も見られない。 – enobayram

7

あなたは「共有」クラスAが

これは、することを可能にすることができます仮想継承を使用していない1 A.そうでない場合は、クラスを持っているために、両方のBとCのための仮想継承を指定する必要があります

inheritance

は、なぜあなたは、これは別の問題ですやりたい:以下持っています。また

+0

悲しいことに、私は1つの答えしか受け入れることができません、しかし、説明のおかげで;) – Invalid

+4

私は手描きとスキャンインの図に+1を与えています。 –

関連する問題