多重继承


多重继承 (正體)

Free Web Hosting with Website Builder

面向对象编程语言中的多重继承(Multiple Inheritance, MI)指的是一个类别可以同时从多于一个父类继承行为与特征的功能。与单一继承相对,单一继承指一个类别只可以继承自一个父类。

C++支援多重继承,允许对现实世界进行更直接的建模,Borland C++OWL Framework 大量使用多重继承来描述视窗的关系。微软的MFC仅使用单一继承描述视窗,ATL使用多重继承实现COM/ActiveXWTL则使用多重继承实现视窗。

多重继承可以导致某些令人混淆的情况,所以关于它的好处与风险之间孰轻孰重常常受人争论。Java使用了一个折衷的办法:Java允许一个类别继承自多于一个父接口(可以指定某一个类别,它继承了所有父类别的类型,并必须拥有所有父类别接口的外部可见方法的具体实现,并允许编译器强制以上要求),但只可以从一个父类别继承实现(方法与数据)。微软的.NET编程语言,例如C#Visual Basic .NET也使用了这种接口的做法。

面向对象的程序设计中,继承描述了两种类型或两个类的物件,其中一种是另外一种的“子类型”或“子类别”。子类别继承了父类别的特征,允许分享功能。例如,可以创造一个“哺乳类动物”类别,拥有进食、繁殖等的功能;然后定义一个子类型“猫”,它可以从父类别继承上述功能,不需重新编写程序,同时增加属于自己的新功能,例如“追赶老鼠”。

然而,如果想同时自多于一个结构继承,例如容许“猫”继承“哺乳类动物”之余,同时继承“卡通角色”和“宠物”,缺乏多重继承往往会导致十分笨拙的混合继承,或迫使同一个功能在多于一个地方被重写。(这带来了维护上的问题)

多年以来,多重继承都是一个敏感的话题,反对者指它增加了程式的复杂性与含糊性,例如在“钻石问题”(或称菱型缺陷)中。Loki函式库针对多重继承进行改良,以TypeList(二叉树结构)避免这个问题。

各种编程语言有不同的方式处理上述问题。例如Eiffel容许子类型透过重新命名,或提前为他们确定选择规则,来适应(adapt)它继承得来的功能。Java允许物件从多个接口继承,但仅允许一个实现继承。REALbasic与它相似,并增加了一个不需使用继承来“扩展”一个类别的功能。Perl使用一种有序列表式的继承机制:搜寻方法时,它会先搜寻当前类别的方法,然后使用深度优先搜索来顺序寻找各个继承类别及其父类别。CLOS允许程式设计者完全控制方法的组合。如果这还不足够,元对象协议给程式设计者一种手段去修改继承,方法调度,类别特例化,及其它内部的机制,而不影响系统的稳定性。

参见

  • 虚拟继承

参考书目

  • Andrei Alexandrescu,《Modern C++ Design》

外部连接







Why are we here?
All text is available under the terms of the GNU Free Documentation License
This page is cache of Wikipedia. History