私は仮想継承の概念を理解し、私はこれのどこに答えを見つけることができませんでした。あなたはBとCは、事実上、Aの2つのインスタンスを避けるために、継承しかし、あなたはBとCの両方で仮想継承を指定しなければならないの作ることができるので、あなたはクラスBとC BとCの両方を継承クラスAを継承したクラスDを持っていると言います2つのうちの一方が事実上Aを継承し、もう一方が実質的に継承しない場合、Aのインスタンスを1つだけ作成していますか?仮想継承、1つのクラスは十分ですか?
おかげ
私は仮想継承の概念を理解し、私はこれのどこに答えを見つけることができませんでした。あなたはBとCは、事実上、Aの2つのインスタンスを避けるために、継承しかし、あなたはBとCの両方で仮想継承を指定しなければならないの作ることができるので、あなたはクラスBとC BとCの両方を継承クラスAを継承したクラスDを持っていると言います2つのうちの一方が事実上Aを継承し、もう一方が実質的に継承しない場合、Aのインスタンスを1つだけ作成していますか?仮想継承、1つのクラスは十分ですか?
おかげ
彼らはすべての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
のクラス格子における)基本クラスB
型AA
のオブジェクト内の別個B
サブオブジェクトと一対一に対応します。以下に示すように、Z
のB
とX
とY
によって共有仮想B
:クラスAA
クラスB
二サブオブジェクトを有し、クラス上記で定義AA
与えられます。
あなたは「共有」クラスAが
これは、することを可能にすることができます仮想継承を使用していない1 A.そうでない場合は、クラスを持っているために、両方のBとCのための仮想継承を指定する必要があります
は、なぜあなたは、これは別の問題ですやりたい:以下持っています。また
悲しいことに、私は1つの答えしか受け入れることができません、しかし、説明のおかげで;) – Invalid
私は手描きとスキャンインの図に+1を与えています。 –
、§10.1/ 4実際にこれを定義します。 –
@sftrabbit:標準のコピーは何ですか? C++ 03では、 '10.1 [class.mi]/6'です。最新の利用可能な作業用紙N3485では、まだ '10.1 [class.mi]/7'です。私は '10.1 [class.mi]/4'で定義されている標準的なコピーを持っていません。 –
私はいつも彼らがOPが頼んでいるものを許可しなかった理由を疑問に思ってきました。私は仮想子供が非仮想子供の親を指していることにいかなる論理的な障害も見られない。 – enobayram