曲径通幽论坛
标题:
多重继承(MI)小结
[打印本页]
作者:
easy
时间:
2013-12-14 21:41
标题:
多重继承(MI)小结
首先考虑不使用虚基类的 MI,在这种形式下,不会引入新的规则。
如果一个类从两个不同的类那里继承了两个同名的成员,那么就需要在派生类中使用类限定符来区分它们。比如,A 和 B 派生二来的 C,那么要使用 A::draw() 和 B::draw() 来区分从这两个类那里继承的 draw() 方法。否则,编译器将指出二义性。
如果一个类通过多种途径继承了一个非虚基类,则该类从每种途径(如上的 A 途径和 B 途径)分别继承非虚基类的一个实例。在某些情况下,这可能是希望的,且没问题的。但大多数情况下,多个基类实例都是问题!
对于使用虚基类的 MI。当派生类使用使用关键字
virtual
来指示派生时,基类就成为了虚基类,比如:
class marketing : public virtual reality { ... };
主要变化(也是使用虚基类的原因)是:
从虚基类的一个或多个实例派生而来的类只继承了一个基类对象
。为了实现这种特性,必须满足其它要求:
1. 有间接虚基类的派生类包含直接调用间接基类构造函数的构造函数,这对于间接非虚基类来说是非法的。具体请参考:《
使用虚基类时的构造函数规则
》。
2. 通过优先规则解决名称二义性。具体请参考:《
[虚基类]名称的优先规则
》
MI 会增加编程的复杂程度。然而,这种复杂性主要是由派生类通过多条途径继承同一个基类引起的。避免这种情况后,唯一需要注意的是,在必要时对继承的名称进行限定。
欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/)
Powered by Discuz! X3.2