2016-05-23 2 views
0

Если предположить, что у меня есть класс Алкоголь и он получил два производных класса: Вино и Пиво. Что произойдет, если я сделаю тогда класс Сидр, который наследует от Вино и Пиво также?класс, который наследует от двух классов в C++

Сколько копий Алкоголь появится в Сидр класс?

Я знаю, что это можно сделать с помощью виртуального наследования и без него, но какая разница?

+8

Очевидно, что с таким количеством алкоголя вы увидите двойное, и будут две базы. –

+8

Независимо от ответа: Это плохая идея. Сидр не является ни вином, ни пивом, поэтому он не должен наследовать ни от одного из них. –

+1

Поиск в Google по «виртуальному натурному алмазу» заставит много статей, объясняющих именно это. И, BTW, и Kerrek SB, и Baum mit Augen верны. – davidbak

ответ

13

Non-виртуальное наследование:

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