谁能想到使用多重继承的任何情况?我能想到的每个案例都可以通过方法运算符来解决
AnotherClass() { return this->something.anotherClass; }
Erik Funkenb.. 29
大规模多重继承的大多数用途是针对mixins.举个例子:
class DraggableWindow : Window, Draggable { } class SkinnableWindow : Window, Skinnable { } class DraggableSkinnableWindow : Window, Draggable, Skinnable { }
等等...
在大多数情况下,最好使用多重继承来严格执行接口继承.
class DraggableWindow : Window, IDraggable { }
然后在DraggableWindow类中实现IDraggable接口.编写好的mixin课程太难了.
MI方法的好处(即使您只使用接口MI)是您可以将各种不同的Windows视为Window对象,但可以灵活地创建单个不可能(或更难)的东西遗产.
例如,在许多类框架中,您会看到如下内容:
class Control { } class Window : Control { } class Textbox : Control { }
现在,假设您想要一个具有Window特征的文本框?就像可拖动,有标题栏等...你可以做这样的事情:
class WindowedTextbox : Control, IWindow, ITexbox { }
在单继承模型中,您不能轻易地从Window和Textbox继承而不会出现重复Control对象和其他类型问题的问题.您还可以将WindowedTextbox视为Window,Textbox或Control.
另外,为了解决.anotherClass()习惯用法,.anotherClass()返回一个不同的对象,而多重继承允许同一个对象用于不同的目的.
大规模多重继承的大多数用途是针对mixins.举个例子:
class DraggableWindow : Window, Draggable { } class SkinnableWindow : Window, Skinnable { } class DraggableSkinnableWindow : Window, Draggable, Skinnable { }
等等...
在大多数情况下,最好使用多重继承来严格执行接口继承.
class DraggableWindow : Window, IDraggable { }
然后在DraggableWindow类中实现IDraggable接口.编写好的mixin课程太难了.
MI方法的好处(即使您只使用接口MI)是您可以将各种不同的Windows视为Window对象,但可以灵活地创建单个不可能(或更难)的东西遗产.
例如,在许多类框架中,您会看到如下内容:
class Control { } class Window : Control { } class Textbox : Control { }
现在,假设您想要一个具有Window特征的文本框?就像可拖动,有标题栏等...你可以做这样的事情:
class WindowedTextbox : Control, IWindow, ITexbox { }
在单继承模型中,您不能轻易地从Window和Textbox继承而不会出现重复Control对象和其他类型问题的问题.您还可以将WindowedTextbox视为Window,Textbox或Control.
另外,为了解决.anotherClass()习惯用法,.anotherClass()返回一个不同的对象,而多重继承允许同一个对象用于不同的目的.
我发现使用mixin类时多重继承特别有用.
如维基百科所述:
在面向对象的编程语言中,mixin是一个提供某个子类继承的功能的类,但并不意味着独立.
我们的产品如何使用mixin类的一个示例是配置保存和恢复目的.有一个抽象的mixin类,它定义了一组纯虚方法.任何可保存的类都继承自save/restore mixin类,它自动为它们提供适当的保存/恢复功能.
但是它们也可以从其他类继承作为它们正常类结构的一部分,因此这些类在这方面使用多重继承是很常见的.
多重继承的一个例子:
class Animal { virtual void KeepCool() const = 0; } class Vertebrate { virtual void BendSpine() { }; } class Dog : public Animal, public Vertebrate { void KeepCool() { Pant(); } }
做任何形式的公共继承时,什么是最重要的(一个或多个)是尊重是一个关系.如果一个类"是"其中一个对象,那么它应该只从一个或多个类继承.如果它只是"包含"其中一个对象,则应使用聚合或组合.
上面的例子结构合理,因为狗是动物,也是脊椎动物.