C++ 多重继承 虚基类

使用多个基类的继承被称为多重继承(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 = (waiter *) & 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.通过优先规则解决名称二义性。

猜你喜欢

转载自blog.csdn.net/qq_42128241/article/details/81637154