为什么以下继承结构在 C++ 中不合法?
- Son1 派生自 Father1
- Son2 派生自 Father1
- GrandSon1 派生自 Son1 和 Son2
如果可能存在合法的情况(也许如果所有类都是纯虚拟的,除了 GrandSon1),它们是什么以及如何产生的?
为什么以下继承结构在 C++ 中不合法?
如果可能存在合法的情况(也许如果所有类都是纯虚拟的,除了 GrandSon1),它们是什么以及如何产生的?
你错了,这在 C++ 中是完全合法的。不过,您可能会研究虚拟继承。
这种继承层次结构被称为死亡钻石,如果您使用虚拟继承,它在 C++ 中是合法的,尽管它通常仍然存在问题。
这就是 C++ 钻石问题。
这是典型的传承钻石。它甚至出现在 iostream 派生自 istream 和 ostream 而这两个派生自 ios_base 的标准库中。
有各种各样的问题:
如果父亲有一个虚方法并且 Son1 和 Son2 都实现了它,除非 Grandson 也实现了它,否则它必须说明它实现了 Son1 和 Son2 的哪个方法。
如果父亲有任何数据成员,孙子将获得两次。
在任何情况下,父亲都有一个 v-table,所以你似乎得到了 2 个副本。
因此,中间类通常使用虚拟继承,这很棘手,但实际上意味着只有最终类获得基类。因此,在这种情况下,Grandson 本身负责构建父亲,并假定“拥有”它。
如果您要投射任何指针,还有其他问题需要注意。特别要小心与 void* 之间的转换。
我认为您混淆了类层次结构和类实例。
“孙子”类可以派生自“儿子”类,但“孙子”的一个实例不能来自“儿子”类的 2 个实例
在任何情况下,我认为你不应该那样做,因为在某些时候你会有一个类“grand-grandson”和一个类“grand-grand-grandson”。
以另一种方式建立父母和兄弟姐妹之间的关系。