9.9 小结
C++中MI存在的一个原因是因为C++是一种混合语言,并且不能像Smalltalk和Java那样实现一个整体的类层次结构。而C++允许形成许多继承树,所以有时可能需要将来自两棵或多棵树的接口关联形成一个新类。
如果在类的层次结构中没有“菱形”的继承结构出现,MI将是相当简单的(虽然基类中完全相同的那些函数识别标志仍然必须解析)。如果有菱形继承结构出现,就需要通过引入虚基类来消除重复子对象。这不仅增加了混乱,而且使接下来的表达方式变得更加复杂和低效。
多重继承已经被称做“百分之90的goto语句”。[1]这种形容似乎是适当的,像避免使用goto语句那样在平常的编程中最好避免使用MI,但有时候它却很有用。它在C++中的地位是“次要的”,但却是C++的更高级特征,这一特征设计是用来解决特殊情况下出现的问题。如果读者发现自己经常使用了它,那么就需要检查一下使用它的原因。问一下自己,“是必需要向上类型转换成为所有的基类类型吗?”如果答案是否定的,假如嵌入的所有类的实例都不需要进行向上类型转换,那么编程工作将会变得更加简单。
[1]Zack Urlocker创造的一个短语。