C ++子类派生自派生自同一个类的类

时间:2011-01-05 14:01:09

标签: c++ multiple-inheritance derived-class

为什么以下继承结构在C ++中不合法?

  • Son1派生自Father1
  • Son2派生自Father1
  • GrandSon1派生自Son1和Son2

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

5 个答案:

答案 0 :(得分:7)

你错了,这在C ++中完全合法。您可以查看virtual inheritance

答案 1 :(得分:3)

这个继承层次结构称为diamond of death,如果使用虚拟继承,它在C ++中是合法的,尽管它通常仍然存在问题。

答案 2 :(得分:1)

这是C ++ Diamond问题。

请参阅:http://en.wikipedia.org/wiki/Diamond_problem

答案 3 :(得分:1)

这是典型的继承钻石。它甚至出现在标准库中,其中iostream来自istream和ostream,这两者都来自ios_base。

存在各种问题:

  • 如果父有一个虚方法,并且Son1和Son2都实现了它,除非Grandson实现它,它必须说明它实现了Son1和Son2的哪个方法。

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

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

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

如果您要投射任何指针,还有其他问题需要注意。特别要注意在空隙中进行铸造*。

答案 4 :(得分:-2)

我认为你混淆了类层次结构和类实例。

“孙子”类可以从“儿子”类派生,但“孙子”的实例不能来自“儿子”类的2个实例

在任何情况下,我认为你不应该这样做,因为在某些时候你会有一个班级“孙子”和一个班级“曾孙子”。

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