为什么以下继承结构在C ++中不合法?
如果可能存在合法的情况(可能所有类都是纯虚拟的,除了GrandSon1),它们是什么以及它们是怎么来的?
答案 0 :(得分:7)
你错了,这在C ++中完全合法。您可以查看virtual inheritance。
答案 1 :(得分:3)
这个继承层次结构称为diamond of death,如果使用虚拟继承,它在C ++中是合法的,尽管它通常仍然存在问题。
答案 2 :(得分:1)
这是C ++ Diamond问题。
答案 3 :(得分:1)
这是典型的继承钻石。它甚至出现在标准库中,其中iostream来自istream和ostream,这两者都来自ios_base。
存在各种问题:
如果父有一个虚方法,并且Son1和Son2都实现了它,除非Grandson实现它,它必须说明它实现了Son1和Son2的哪个方法。
如果父亲有任何数据成员,那么孙子会得到他们两次。
在任何情况下,父亲都有一个v-table,所以你似乎得到了2份副本。
因此,中间类通常使用虚拟继承,这很棘手,但实际上只意味着最终的类获得基类。所以在这种情况下,孙子本身负责构建父亲,并被假定为“拥有”它。
如果您要投射任何指针,还有其他问题需要注意。特别要注意在空隙中进行铸造*。
答案 4 :(得分:-2)
我认为你混淆了类层次结构和类实例。
“孙子”类可以从“儿子”类派生,但“孙子”的实例不能来自“儿子”类的2个实例
在任何情况下,我认为你不应该这样做,因为在某些时候你会有一个班级“孙子”和一个班级“曾孙子”。
以另一种方式在父母和兄弟姐妹之间建立关系。