sie*_*ema 0 c++ oop inheritance abstract-class multiple-inheritance
假设我有一个酒类,它有两个派生类:葡萄酒和啤酒.如果我将制作一个继承了Wine和Beer的类Cider,会发生什么?
在Cider类中会出现多少份酒精?
我知道它可以通过虚拟继承来完成而没有它,但会有什么区别?
Ker*_* SB 13
非虚拟继承:
struct Beer : Alcohol {};
struct Wine : Alcohol {}; // I'll have what he's having!
Run Code Online (Sandbox Code Playgroud)
Alcohol Alcohol // ...whe-ere'sh my... bayshe clashhh... hic
^ ^
| |
Beer Wine
^ ^
\ /
\ /
Cider
Run Code Online (Sandbox Code Playgroud)
虚拟继承:
struct Beer : virtual Alcohol {}; // virtual = doesn't get you drunk
struct Wine : virtual Alcohol {};
Run Code Online (Sandbox Code Playgroud)
Alcohol // you can see clearly now
^ ^
/ \
Beer Wine
^ ^
\ /
\ /
Cider
Run Code Online (Sandbox Code Playgroud)
在非虚拟情况下,有两个不同的基础子对象.让我们来看看他们:
Cider x;
Alcohol & a1 = static_cast<Beer&>(x);
Alcohol & a2 = static_cast<Wine&>(x);
assert(std::addressof(a1) != std::addressof(a2));
Run Code Online (Sandbox Code Playgroud)