0

我有一個關於虛擬基類的查詢。爲了解決多重繼承中「可怕的鑽石死亡」/歧義問題,引入了虛擬基類。C++中的虛擬基類

class A { public: void Foo() {} }; 
class B : public virtual A {}; 
class C : public virtual A {}; 
class D : public B, public C {}; 

當關鍵字virtualclass C聲明不使用會發生什麼。你能詳細解釋我嗎?

class A { public: void Foo() {} }; 
class B : public virtual A {}; 
class C : public A {}; 
class D : public B, public C {}; 
+0

的可能重複(http://stackoverflow.com/questions/21558/in-c-what - 是一個虛擬基類) – 2013-04-08 07:05:38

+0

旁註:使用合成而不是繼承(使用基於組件的設計模式) – Quonux 2013-04-08 08:41:35

+0

「死亡鑽石」是C++多重繼承中的問題,而不是多重繼承。 – Kaz 2013-06-17 03:13:48

回答

3

如果你的繼承不是virtual然後A成員將出席兩次D類。

如果A有一個名爲_a,然後領域,D,寫B::_aC::_a就指的是兩個不同的內存區域。如果你的繼承是virtual那麼你只有一個內存區域。

0

如果您正在使用虛擬比會有任何含糊,當你使用的Class D實例調用foo()。如果你不使用虛擬比這將是含糊不清.. 但要小心的是虛擬繼承成本更因此請謹慎使用它..

0
class A { public: void Foo() {} }; 
class B : public virtual A {}; 
class C : public A {}; 
class D : public B, public C {}; 

如果從A類繼承向B標虛擬而非A類C到C,那麼C++將創建一個虛擬A(D繼承B,B繼承A)和一個非虛擬A(D繼承C,C繼承A)。因此,您的代碼將不會解決問題的鑽石:?在C++中,什麼是虛基類]

D d_object; 
A &a_ref = d_object; // error raised -> B::A or C::A