为什么是下面的继承的结构不合法的C++?

  • Son1来自Father1
  • Son2来自Father1
  • GrandSon1来自Son1和Son2

如果有可能的情况这是合法的(也许如果所有类是纯粹的虚拟除GrandSon1),它们是什么和怎么来的?

有帮助吗?

解决方案

你错了,这是完全合法的,在C++。你可能看到 虚拟继承 虽然。

其他提示

这种继承层次是所谓的 钻石的死亡 和它的法律在C++如果使用虚拟的继承,尽管它通常仍然成问题。

这是C++钻石的问题。

参见: http://en.wikipedia.org/wiki/Diamond_problem

这是典型的继承的钻石。这甚至发生在标准库法师来自两istream和ostream和这两个来自ios_base.

有各种不同的问题:

  • 如果父亲有一个虚拟的方法和两个Son1和Son2实现,除非孙子实现了它太它国家的Son1和Son2的方法实现。

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

  • 在任何情况下父亲有表所以你似乎得到的2份。

中产阶级因此通常使用虚拟继承,这是非常棘手,但是实际上意味着只有最后一类获取基类。因此,在这种情况下,孙子本身是负责建造的父亲和被假定为"有"。

有进一步的问题要小心如果你要投的任何指针。特别要注意与铸造和从void*。

我认为你是混乱的类层次和类实例。

一个"孙子"类可以源自一个"儿子"类,但是一个实例"的孙子"不能从2类的实例"儿子"

在任何情况下,我认为你不应该这样做,因为在某些时候你会有一类"的大孙子"一类的"grand-grand-孙子".

使有关的船舶之间父母和兄弟姐妹的另一种方式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top