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 = (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.通过优先规则解决名称二义性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值