1

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

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

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

4

5 回答 5

7

你错了,这在 C++ 中是完全合法的。不过,您可能会研究虚拟继承

于 2011-01-05T14:05:05.190 回答
3

这种继承层次结构被称为死亡钻石,如果您使用虚拟继承,它在 C++ 中是合法的,尽管它通常仍然存在问题。

于 2011-01-05T14:03:57.093 回答
1

这就是 C++ 钻石问题。

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

于 2011-01-05T14:03:53.570 回答
1

这是典型的传承钻石。它甚至出现在 iostream 派生自 istream 和 ostream 而这两个派生自 ios_base 的标准库中。

有各种各样的问题:

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

  • 如果父亲有任何数据成员,孙子将获得两次。

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

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

如果您要投射任何指针,还有其他问题需要注意。特别要小心与 void* 之间的转换。

于 2011-01-05T14:24:24.880 回答
-2

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

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

在任何情况下,我认为你不应该那样做,因为在某些时候你会有一个类“grand-grandson”和一个类“grand-grand-grandson”。

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

于 2011-01-05T14:09:46.210 回答