【问题标题】:A class that inherits from two classes in c++从C++中的两个类继承的类
【发布时间】:2016-09-20 22:07:02
【问题描述】:

假设我有一个类 Alcohol,它有两个派生类:WineBeer。如果我将创建一个继承自 WineBeer 的类 Cider 会发生什么?

Cider类中会出现多少份Alcohol

我知道它可以通过虚拟继承和没有它来完成,但会有什么区别?

【问题讨论】:

  • 很明显,用那么多酒精,你会看到双倍的,并且会有两个碱基。
  • 独立于答案:这是一个坏主意。苹果酒既不是葡萄酒也不是啤酒,所以它不应该继承其中任何一个。
  • 谷歌搜索“钻石继承虚拟”会找到大量解释这一点的文章。而且,顺便说一句,Kerrek SB 和 Baum mit Augen 都是正确的。
  • @BaummitAugen:嗯……它像啤酒一样便宜,但看起来像葡萄酒一样豪华,所以我可以看看如何到达那里。
  • @BaummitAugen:比喻正在迅速走下坡路!现在cheapAlcohol?我认为我们在一些地方走得太远了......

标签: c++ oop inheritance abstract-class multiple-inheritance


【解决方案1】:

非虚拟继承:

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

在非虚拟情况下,有两个不同的基础子对象。让我们开始吧:

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

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

【讨论】:

  • @siema:如图所示:两个。一个在左边,一个在右边。
  • 只为喜剧图 cmets 点赞! :)
  • 类和结构一样吗?
  • @siema struct 只是所有内容都公开的类
  • @KerrekSB 酷,这个答案是刘海。现在刺激另一个 spliff ;-) ...(酗酒者 pfffft ...)
猜你喜欢
  • 2012-06-23
  • 2011-09-04
  • 2013-02-19
  • 2011-10-01
  • 2010-09-23
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多