2011-01-05 116 views
1

为什么下面的继承结构在C++中不合法?从派生自同一类的类派生的C++子类

  • SON1从Father1派生
  • Son2从Father1派生
  • GrandSon1从SON1和Son2派生

如果有可能的情况下,这是合法的(也许如果所有的类都是纯铁虚拟除了GrandSon1),它们是什么以及怎么来的?

+0

你说的“不合法”是什么意思? – Jon 2011-01-05 14:04:15

+0

为什么它不合法?请参阅:http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.8(25.8和25。9) – badgerr 2011-01-05 14:05:54

+5

非法'儿子'=='混蛋'? – 2011-01-05 14:07:37

回答

3

这个继承层次称为diamond of death并在C是合法++如果你使用虚拟继承,但它通常是仍是个问题。

+0

这个答案使C++编程听起来非常危险。 – 2011-01-05 14:11:32

+3

@Space:C++ *是非常危险的。 – 2011-01-05 14:15:14

-2

我觉得你是令人困惑的类层次结构和类实例。

一个“孙子”类可以从一个“儿子”类派生的,而是一个“孙子”的实例不能从类“儿子”

在任何情况下2个实例,我觉得你不应该这样做,因为在某些时候,你会有一个“孙子孙”班和一个“孙中山孙”班。

以另一种方式建立父母和兄弟姐妹之间的关系。

+4

-1:我认为你使C++与一种不支持多继承的语言混淆。 – 2011-01-05 14:13:14

+0

@ Space_C0wb0y:请确保您不会将C++混淆为支持它的语言*正确* – 2011-01-05 14:19:42

+0

也许我在原始问题的措辞中感到困惑。 父亲与基地,儿子与派生... – Max 2011-01-05 14:29:58

1

这是典型的继承钻石。它甚至发生在iostream从istream和ostream中派生的标准库中,并且这两个派生自ios_base。

有各种问题:

  • 如果父亲有一个虚拟的方法和SON1和Son2都实现它,除非孙子实现它也有陈述其SON1它实现Son2的方法。

  • 如果父亲有任何数据成员,孙子会让他们两次。

  • 在任何情况下,父亲有一个V - 表,所以你似乎得到2份副本。

因此,中间类通常使用虚拟继承,这很棘手,但实际上意味着只有最终的类获得基类。因此,在这种情况下,孙子本身负责构建父亲,并被假定为“拥有”父亲。

还有其他问题要注意,如果你要投任何指针。特别要注意铸造空出来*。