2013-08-21 162 views
1

爲了解決鑽石問題,我們開始進行虛擬繼承。虛擬繼承

class A {} 
class B : virtual Public A {} 
class C : virtual Public A {} 
class D : public B, Public C {} 

爲什麼不能這樣定義:

class A {} 
class B : public A {} 
class C : public A {} 
class D : virtual public B, virtual public C {} 

什麼是具有現有的解決方案來解決用C鑽石++的問題,而不是第二個背後的技術原因。 改變基類的繼承來解決派生類中的某些問題並不容易。

這將是偉大的,如果有人可以提供技術錯綜複雜。 謝謝。

回答

0

這已經回答了here: -

你想:(可實現與虛擬繼承)

D 
/\ 
B C 
    \/
    A 

而不是:(不包括虛擬繼承會發生什麼)

D 
/\ 
    B C 
    | | 
    A A 
+0

我知道, 。我的問題更多的是語法。爲什麼我們不能有第二種語法?背後的原因是什麼? – user2704831

+0

原因在這裏得到了很好的解釋: - http://en.wikipedia.org/wiki/Diamond_problem#The_diamond_problem –

+0

C++在默認情況下遵循每個繼承路徑,所以D對象實際上包含兩個單獨的A對象,並且使用A的成員必須合格。 –