C++编程-多重继承

文章讨论了C++中的多重继承(MI)带来的复杂性和问题,如类型转换的必要性以及可能导致的函数二义性。使用虚基类可以解决对象重复继承的问题,但需要显式调用构造函数。解决函数二义性的方法是使用限定符来区分同名函数。对于MI的使用,建议是谨慎和适度。
摘要由CSDN通过智能技术生成

与单继承相比,使用MI更困难,也更容易出现问题。由于这个原因,很多C++用户强烈反对使用MI,一些人甚至希望删除MI;而喜欢MI的人认为,对一些特殊的工程来说,MI很有用,甚至是必不可少的;也有人建议谨慎、适度的使用MI。

 

当定义一个SingerWaiter的对象时,无法确定worker是singer的还是waiter的,这时候需要使用类型转换来指定对象:

SingerWaiter *ed = new SingerWaiter;   //包含两个worker的对象地址

Worker * pw = (Waiter*)ed;            //worker in waiter

Worker * pw = (Singer *)ed;           //worker in singer

虚基类

虚基类使得从多个类(它们的基类相同)派生出的对象只继承一个基类对象。

Class Singer:public virtual Worker{};

Class Waiter:virtual public Worker{};

Class SingerWaiter:public Singer,public Waiter{};

这个时候SingerWaiter对象只包含Worker对象的一个副本。

SingerWaiter(const Worker &wk, int p=0, int v=Singer::other)

:Worker(wk),Waiter(wk,p),Singer(wk,v){}

需要显示的调用worker的构造函数,则需要上述形式。对于虚基类,必须这样做;对非虚基类,则是非法的。

方法调用

在多重继承中,父子类中都包含了show函数,则产生函数的二义性。

解决办法:使用限定符来限定相应的函数,进行区分。

Void SingerWaiter::show()

{

       Singer::show();

       Waiter::show();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值