C++多重继承的现实世界示例有哪些?

13

除了教科书的例子之外,在现实世界中,是否有理由在 C++ 中使用多重继承(其中不止一个基类不是纯接口)?


在近20年的C++编程中,我从未遇到过必须使用多重继承的情况,因此我认为它并不是必需的。 - Raedwald
@Raedwald 这并不意味着某人不应该知道C++中的多重继承是如何工作的。 - user366312
7个回答

11

2
那里有一个教科书上的例子,但没有引用来自现实世界的东西。 - Potatoswatter

4

最容易指向的是 iostream,它继承自 istreamostreamcincout 分别是 istreamostream,但是 fstream 派生自 iostream


3

2

在我看来,这是有争议的。在使用模板之前,有很多情况需要使用它。基本上,您可以像使用模板的策略类一样使用基类。例如,考虑以下模板:

template <typename policy1, typename policy2>
class whatever {
    policy1 p1;
    policy2 p2;
public:
    void dosomething() { if (p1.enquire()) p2.dosomething(); }
};

如果您出于某种原因不想使用模板,您可以通过多继承获得(一些)相似的能力:
class whatever : policy1, policy2 {   
    void dosomething() { if (enquire()) dosomething();  }

在这两种情况下,你基本上是将“policy”实例嵌入到你的新对象中。由于我们使用了私有继承,所以不用担心LSP -- 就像使用基于策略的模板一样,意图并不是创建一个关于层次结构成员之间关系的大层次结构 -- 而是仅仅为了创建能够按需求创建各种无关类的能力。

};


0

多重继承确实有其用武之地,它可以非常有用。作为一般准则,基类应尽可能是抽象的,这意味着您不应该能够从中创建对象,但没有任何阻止您从具体类继承。它绝对是一个优点,因为您可以利用来自基类的继承实现。iostream上的一个答案的示例就是一个很好的例子。另一个例子可能是模拟既是员工又是业主/董事的企业,并将其建模为

public class Director
{
   ................
   double CalculateDividend();
   bool ApproveBudget();
};

public class Employee
{
   ................
   double CalculateSalary();
};


public class WorkingDirector: Employee, Director
{
   ..............
};

现在,WorkingDirector对象可以执行雇员和主管所能执行的操作,这在现实世界中是完美的。我们甚至无需重写任何方法实现。
在许多情况下,使用多重继承支持还可以更轻松地实现设计模式。

这不是一个真实的单词示例。 - Petter

0

我在“现实世界”中使用了多重继承——在一份工作中,我参与编写了一个映射应用程序。

不幸的是,我无法记住确切的例子,这让我感到非常沮丧。

然而,这里有一篇有趣的文章,介绍了需要考虑的要点以及可供考虑使用的替代模式或解决方案:

http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.2

我喜欢使用车辆作为示例,特别是加入两栖车辆。


0
如果我们有一个类别叫做“击球手”,它具有数据成员,如得分数、六分数、四分数、击球平均分、跑率等。我们还有另一个类别叫做“投球手”,它可能具有数据成员,如被击出的界外球数、每局跑数、平均击球等。对于一名全能选手,类别“全能选手”将从“击球手”和“投球手”两个类别派生而来。 这可以被引用为多重继承的现实世界例子。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接