2016-05-23 14 views
0

Unter der Annahme, dass ich eine Klasse Alkohol bekommen habe und es hat zwei abgeleiteten Klassen bekommt: Wein und Bier. Was passiert, wenn ich dann eine Klasse Cider mache, die von Wine und Beer auch erbt?Eine Klasse, die von zwei Klassen in C++ erbt

Wie viele Kopien von Alkohol wird in Cider Klasse erscheinen?

Ich weiß, dass es mit virtueller Vererbung und ohne es getan werden kann, aber was wird der Unterschied sein?

+8

Offensichtlich, mit so viel Alkohol, werden Sie doppelt sehen, und es wird * zwei * Basen. –

+8

Unabhängig von der Antwort: Das ist eine schlechte Idee. Apfelwein ist weder Wein noch Bier, also sollte er von keinem von beiden erben. –

+1

Eine Google-Suche auf "Diamantvererbung virtuell" wird viele Artikel aufdecken, die genau das erklären. Und übrigens, sowohl Kerrek SB als auch Baum mit Augen sind richtig. – davidbak

Antwort

13

Nicht virtuelle Vererbung:

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 

Virtuelle Vererbung:

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

Im nicht-virtuellen Fall gibt es zwei disctinct Basis Subobjekte. Kommen wir zu ihnen:

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

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

ok, aber wie viele Kopien von Alcohol werden in beiden Fällen erscheinen? – siema

+0

@siema: Wie das Bild zu zeigen versucht: zwei. Einer links und einer rechts. –

+2

upvoting nur für die Komödie Diagramm Kommentare! :) – Alnitak