收到编译错误。

当c54g。getid()评价,编译器查看wirelessadaptor包含函数名为getid()。不行。编译器并查看是否有任何的基类有一个功能叫做getid()。看到这里的问题?问题是,c54g实际上包含两个getid()功能:一种来自usbdevice,和一个来自wirelessdevice。因此,这个函数调用有二义性,你会如果您尝试编译它收到编译错误。

然而,有一个解决这个问题的方法:你可以显式地指定哪个版本,你要打电话:

1
2
3
4
5
6
7
int main()
{
     WirelessAdaptor c54G(5442, 181742);
     cout << c54G.USBDevice::GetID();
 
     return 0;
}

虽然这种方法是非常简单的,你可以看到如何可以得到复杂时,你的类继承自四或六的基类,继承其它类本身。命名冲突成倍增加你继承类的潜力,和每个这些命名冲突,需要明确地解决。

第二,更严重的是钻石的问题,而你的作者喜欢称之为“厄运”钻石。这发生在当一个类将两类每个继承从一个基类继承。这导致了一个钻石形的遗传模式。

例如,考虑下面的类集:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class PoweredDevice
{
};
 
class Scanner: public PoweredDevice
{
};
 
class Printer: public PoweredDevice
{
};
 
class Copier: public Scanner, public Printer
{
};

扫描仪和打印机都是动力装置,所以他们来自powereddevice。然而,复制机,包括双方的扫描仪和打印机的功能。

有在这样的背景下出现的许多问题,包括是否复印机应该有一个或两个拷贝的powereddevice,如何解决不明确的引用某些类型。虽然大多数的这些问题可以通过明确的范围的解决,维护的费用加到你的类以处理增加的复杂性会造成开发时间暴涨。

多重继承的是更多的麻烦比它的价值?

事实上,大多数可以解决使用多重继承可以使用单继承和解决的问题。许多面向对象的语言(如Smalltalk,PHP)甚至不支持多重继承。许多比较现代的语言如Java和C #限制类正常类的单一继承,但允许接口类的多重继承(稍后我们将对此进行介绍)。在不允许多重继承的语言中,驱动的想法是,它只是使语言太复杂,并最终造成更多的问题比它修复。

许多作家和有经验的程序员相信在C + +多重继承应该不惜一切代价避免由于许多潜在的问题,它所带来的。作者不同意这种做法,因为有些时候,情况下,多重继承是最好的生活方式。然而,多重继承,应使用非常明智。

作为一个有趣的插曲,你已经使用类使用多继承而不自知:iostream库对象CIN和法院都使用多重继承实现。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值