当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和法院都使用多重继承实现。