使用多个基类的继承被称为多重继承(MI)。
MI描述的是有多个直接基类的类。与单继承一样,公有MI表示的也是 is--a关系。
MI带来的两个主要问题:
1. 从两个不同的基类继承同名方法。
2. 从两个或更多相关基类那里继承同一类的多个实例。
例如:
singer 和 waiter都继承了一个worker 组件,因此singingwaiter将包含两个worker组件。
通常可以将派生类对象地址赋给基类指针,现在将出现二义性:
singingwaiter ed;
worker * pw = ed;
通常这种赋值将把基类指针设置为派生对象中的基类对象地址,但ed 中包含两个worker 对象,有两个地址可供选择, 所以应使用类型转换来指定对象:
worker * pw1 = (waiter *) & ed;
worker * pw2 = (singer *) & ed;
这将使得使用基类指针来引用不同的对象(多态性)复杂化。
C++引入多重继承的同时,也引入了虚基类。
虚基类使得从多个类(它们的基类相同)派生出的对象只继承一个基类对象。
例如:在通过在类声明中使用关键字virtual ,可以使worker被用作singer和waiter的虚基类(virtual 和 public次序无紧要关系)。
class singer : virtual public worker {.......}
class waiter : public virtual worker {.......}
然后将singingwaiter类定义为:
class singingwaiter : public singer, public waiter {.......}
为实现这种特性,必须满足其他要求:
1. 有间接虚基类的派生类包含直接调用间接基类构造函数的构造函数,这对于间接非虚基类来说是非法的。
2.通过优先规则解决名称二义性。