9.7 避免使用多重继承

9.7 避免使用多重继承 - 图1

当提到关于是否使用多重继承的问题时,至少要回答如下两个问题:

1)是否需要通过新类来显示两个类的公共接口?(换句话说,如果一个类能够包含在另一个类中,那么仅有它的某些接口暴露在一个新类中。)

2)需要向上类型转换成为两个基类类型吗?(当基类的数量多于两个时也适用。)

如果可以对上面任何一个问题回答“不是”,那么就可以避免使用MI,并且应该这样做。

请看这样的情况,一个类只是作为一个函数的参数需要向上进行类型转换。在这种情况下,这个类就可以被嵌入,并且在新类中有一个自动类型转换函数提供产生一个指向嵌入的对象的引用。任何时候,如果要将新类的一个对象作为参数传递给某个期盼嵌入对象的函数,这就需要使用类型转换函数。[1]然而,类型转换不能用于普通的多态成员函数的选择;那需要使用继承机制来完成。推荐使用组合而不使用继承,从总体上来说这是个不错的设计指导原则。

[1]Jerry Schwarz,输入输出流(iostream)的作者,曾在个别场合表示如果他重新设计iostream的话,很可能从iostream的设计中去除多重继承,而采用多重流缓冲区和转换运算符。