C++的亚类,来自班,来自同一类
-
25-09-2019 - |
题
为什么是下面的继承的结构不合法的C++?
- Son1来自Father1
- Son2来自Father1
- GrandSon1来自Son1和Son2
如果有可能的情况这是合法的(也许如果所有类是纯粹的虚拟除GrandSon1),它们是什么和怎么来的?
解决方案
你错了,这是完全合法的,在C++。你可能看到 虚拟继承 虽然。
其他提示
这种继承层次是所谓的 钻石的死亡 和它的法律在C++如果使用虚拟的继承,尽管它通常仍然成问题。
这是C++钻石的问题。
这是典型的继承的钻石。这甚至发生在标准库法师来自两istream和ostream和这两个来自ios_base.
有各种不同的问题:
如果父亲有一个虚拟的方法和两个Son1和Son2实现,除非孙子实现了它太它国家的Son1和Son2的方法实现。
如果父亲有任何数据成员,孙子会得到他们两次。
在任何情况下父亲有表所以你似乎得到的2份。
中产阶级因此通常使用虚拟继承,这是非常棘手,但是实际上意味着只有最后一类获取基类。因此,在这种情况下,孙子本身是负责建造的父亲和被假定为"有"。
有进一步的问题要小心如果你要投的任何指针。特别要注意与铸造和从void*。
我认为你是混乱的类层次和类实例。
一个"孙子"类可以源自一个"儿子"类,但是一个实例"的孙子"不能从2类的实例"儿子"
在任何情况下,我认为你不应该这样做,因为在某些时候你会有一类"的大孙子"一类的"grand-grand-孙子".
使有关的船舶之间父母和兄弟姐妹的另一种方式。
不隶属于 StackOverflow