2016-05-23 42 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