2016-05-23 43 views
0

假設我有一類酒精它已得到兩個派生類的類:葡萄酒啤酒。如果我會做一個類蘋果酒繼承啤酒以及如何?從兩個類繼承在C++

酒精將出現蘋果酒類?

我知道它可以用虛擬繼承來完成,沒有它但是會有什麼區別?

+8

很明顯,有了這麼多的酒精,你會看到雙倍,並且會有*兩個*基地。 –

+8

獨立於答案:這是一個壞主意。蘋果酒既不是葡萄酒也不是啤酒,所以它不應該從其中任何一方繼承。 –

+1

谷歌搜索「鑽石繼承虛擬」將出現大量的文章解釋這一點。而且,BTW,Kerrek SB和Baum mit Augen都是正確的。 – davidbak

回答

13

非虛擬繼承:

struct Beer : Alcohol {}; 
struct Wine : Alcohol {};   // I'll have what he's having! 
Alcohol Alcohol     // ...whe-ere'sh my... bayshe clashhh... hic 
^  ^
    |   | 
Beer  Wine 
    ^ ^
    \ /
     \ /
     Cider 

虛繼承:

struct Beer : virtual Alcohol {}; // virtual = doesn't get you drunk 
struct Wine : virtual Alcohol {}; 
 Alcohol      // you can see clearly now 
    ^ ^
    /  \ 
Beer  Wine 
    ^ ^
    \ /
     \ /
     Cider 

在非虛擬情況下,有兩個disctinct基地子對象。我們來看看他們:

Cider x; 
Alcohol & a1 = static_cast<Beer&>(x); 
Alcohol & a2 = static_cast<Wine&>(x); 

assert(std::addressof(a1) != std::addressof(a2)); 
+0

沒問題,但是在兩種情況下酒精的份數是多少? – siema

+0

@siema:照片試圖展示:兩張。一個在左邊,一個在右邊。 –

+2

upvoting只是爲喜劇圖評論! :) – Alnitak