用于多重继承?

21 oop multiple-inheritance

谁能想到使用多重继承的任何情况?我能想到的每个案例都可以通过方法运算符来解决

AnotherClass() { return this->something.anotherClass; }
Run Code Online (Sandbox Code Playgroud)

Eri*_*sch 29

大规模多重继承的大多数用途是针对mixins.举个例子:

class DraggableWindow : Window, Draggable { }
class SkinnableWindow : Window, Skinnable { }
class DraggableSkinnableWindow : Window, Draggable, Skinnable { }
Run Code Online (Sandbox Code Playgroud)

等等...

在大多数情况下,最好使用多重继承来严格执行接口继承.

class DraggableWindow : Window, IDraggable { }
Run Code Online (Sandbox Code Playgroud)

然后在DraggableWindow类中实现IDraggable接口.编写好的mixin课程太难了.

MI方法的好处(即使您只使用接口MI)是您可以将各种不同的Windows视为Window对象,但可以灵活地创建单个不可能(或更难)的东西遗产.

例如,在许多类框架中,您会看到如下内容:

class Control { }
class Window : Control { }
class Textbox : Control { }
Run Code Online (Sandbox Code Playgroud)

现在,假设您想要一个具有Window特征的文本框?就像可拖动,有标题栏等...你可以做这样的事情:

class WindowedTextbox : Control, IWindow, ITexbox { }
Run Code Online (Sandbox Code Playgroud)

在单继承模型中,您不能轻易地从Window和Textbox继承而不会出现重复Control对象和其他类型问题的问题.您还可以将WindowedTextbox视为Window,Textbox或Control.

另外,为了解决.anotherClass()习惯用法,.anotherClass()返回一个不同的对象,而多重继承允许同一个对象用于不同的目的.


Leo*_*Hat 13

我发现使用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(); }
}
Run Code Online (Sandbox Code Playgroud)

做任何形式的公共继承时,什么是最重要的(一个或多个)是尊重是一个关系.如果一个类"是"其中一个对象,那么它应该只从一个或多个类继承.如果它只是"包含"其中一个对象,则应使用聚合或组合.

上面的例子结构合理,因为狗是动物,也是脊椎动物.

  • @Erik - 如果 mixin 类完全抽象,它只是一个接口。在我给出的代码示例中,Vertebrate::BendSpine() 有一个实现,尽管是一个空的实现。我仍然会称之为多重继承,即使它不是最好的例子。 (2认同)
  • 脊椎动物是动物的子类,而狗只是脊椎动物的子类,这不是更有意义吗?最后我查了一下,所有的脊椎动物都是动物。 (2认同)
  • 像这样的更好的例子是FlyingCreature作为mixin.大多数鸟类和一些哺乳动物(蝙蝠)将继承FlyingCreature以及Bird或哺乳动物基类.类似地,对于其他属性,这会影响跨越通常分类法的行为. (2认同)

gre*_*ade 5

大多数人在将多个接口应用于一个类的上下文中使用多重继承。这是 Java 和 C# 等强制执行的方法。

C++ 允许您在类型之间的 is-a 关系中相当自由地应用多个基类。因此,您可以将派生对象视为其任何基类。

正如LeopardSkinPillBoxHat 指出的那样,另一个用途是混合使用。一个很好的例子是Loki 库,来自 Andrei Alexandrescu 的书 Modern C++ Design。他使用他所说的策略类,通过继承来指定给定类的行为或要求。

另一种用途是简化模块化方法,该方法通过在经常令人恐惧的菱形层次结构中使用姊妹类委托来实现API 独立性

MI 的用途很多。滥用的可能性更大。


lui*_*bal 5

Java 有接口。C++ 没有。

因此,可以使用多重继承来模拟接口特性。如果你是一个C#和Java程序员,每次使用扩展基类的类也实现了几个接口,你是那种承认多重继承可以在某些情况下非常有用。

  • C++ 使用抽象类 100% 模拟接口。您所说的“界面功能”是什么?Java/C# 版本的接口多重继承? (3认同)

Jon*_*len 5

我认为这对样板代码最有用。例如,IDisposable 模式对于 .NET 中的所有类都完全相同。那么为什么要一遍又一遍地重新键入该代码呢?

另一个例子是 ICollection。绝大多数接口方法的实现完全相同。只有几个方法实际上是您的类所独有的。

不幸的是,多重继承很容易被滥用。人们很快就会开始做一些愚蠢的事情,比如 LabelPrinter 类继承自他们的 TcpIpConnector 类,而不是仅仅包含它。