为什么下面的继承结构在C++中不合法?从派生自同一类的类派生的C++子类
- SON1从Father1派生
- Son2从Father1派生
- GrandSon1从SON1和Son2派生
如果有可能的情况下,这是合法的(也许如果所有的类都是纯铁虚拟除了GrandSon1),它们是什么以及怎么来的?
为什么下面的继承结构在C++中不合法?从派生自同一类的类派生的C++子类
如果有可能的情况下,这是合法的(也许如果所有的类都是纯铁虚拟除了GrandSon1),它们是什么以及怎么来的?
你错了,这在C++中是完全合法的。不过你可以看看virtual inheritance。
这是C++钻石问题。
这个继承层次称为diamond of death并在C是合法++如果你使用虚拟继承,但它通常是仍是个问题。
这个答案使C++编程听起来非常危险。 – 2011-01-05 14:11:32
@Space:C++ *是非常危险的。 – 2011-01-05 14:15:14
我觉得你是令人困惑的类层次结构和类实例。
一个“孙子”类可以从一个“儿子”类派生的,而是一个“孙子”的实例不能从类“儿子”
在任何情况下2个实例,我觉得你不应该这样做,因为在某些时候,你会有一个“孙子孙”班和一个“孙中山孙”班。
以另一种方式建立父母和兄弟姐妹之间的关系。
-1:我认为你使C++与一种不支持多继承的语言混淆。 – 2011-01-05 14:13:14
@ Space_C0wb0y:请确保您不会将C++混淆为支持它的语言*正确* – 2011-01-05 14:19:42
也许我在原始问题的措辞中感到困惑。 父亲与基地,儿子与派生... – Max 2011-01-05 14:29:58
这是典型的继承钻石。它甚至发生在iostream从istream和ostream中派生的标准库中,并且这两个派生自ios_base。
有各种问题:
如果父亲有一个虚拟的方法和SON1和Son2都实现它,除非孙子实现它也有陈述其SON1它实现Son2的方法。
如果父亲有任何数据成员,孙子会让他们两次。
在任何情况下,父亲有一个V - 表,所以你似乎得到2份副本。
因此,中间类通常使用虚拟继承,这很棘手,但实际上意味着只有最终的类获得基类。因此,在这种情况下,孙子本身负责构建父亲,并被假定为“拥有”父亲。
还有其他问题要注意,如果你要投任何指针。特别要注意铸造空出来*。
你说的“不合法”是什么意思? – Jon 2011-01-05 14:04:15
为什么它不合法?请参阅:http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.8(25.8和25。9) – badgerr 2011-01-05 14:05:54
非法'儿子'=='混蛋'? – 2011-01-05 14:07:37