什么是C ++多重继承的真实示例?

时间:2010-02-23 04:42:35

标签: c++ design-patterns inheritance multiple-inheritance

除了教科书示例 - 在现实世界中 - 在C ++中使用多重继承(其中多个基类不是纯接口)是否有意义?

7 个答案:

答案 0 :(得分:11)

例如,使用Policy-based design时非常常见。

答案 1 :(得分:4)

最容易指向iostream,其继承自istreamostreamcincout分别为istreamostream,但fstream来自iostream

答案 2 :(得分:3)

Microsoft的ATL(活动模板库)使用多重继承作为mixin类:

http://en.wikipedia.org/wiki/Active_Template_Library

答案 3 :(得分:2)

IMO,这是有争议的。在模板之前,有相当多的案例证明了这一点。基本上,您可以使用基类,就像您可以使用模板的策略类一样。例如,考虑一个模板,如:

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();  }

};

在这两种情况下,您基本上都是将“策略”的实例嵌入到新对象中。由于我们使用私有继承,因此不关心LSP - 与基于策略的模板非常相似,其目的不是创建一个大型层次结构来断言层次结构成员之间的关系 - 而是只是创建了按需创建各种不相关类的能力。

答案 4 :(得分:0)

我在“现实世界”中使用了多重继承 - 在我参与编写地图应用程序的工作中。

不幸的是,我不记得我发现令人难以置信的令人沮丧的确切例子。

然而,这是一篇有趣的文章,关于要考虑的要点以及要考虑使用的替代模式或解决方案:

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

我喜欢使用车辆作为例子 - 尤其是加入两栖车辆。

答案 5 :(得分:0)

多重继承肯定有它的位置,它可能非常有用。作为一般准则,基类应尽可能是抽象的,这意味着你不能从中创建一个对象,但没有什么能阻止你继承具体的类。这绝对是一个优点,你可以利用基类的继承实现。关于iostream的答案之一的示例是一个很好的例子。另一个例子可能是对一位同时也是企业所有者/董事的员工进行建模,然后将其建模为

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

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


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

现在,一个WorkingDirector对象可以完成Employee和Director可以做的事情,这在现实世界中是完美的。我们甚至不需要覆盖任何方法实现。

在许多情况下,通过多重继承支持,实现设计模式也变得更容易。

答案 6 :(得分:0)

如果我们有一个蝙蝠侠班级,它的数据成员喜欢跑步次数,否。六分之一,四分之一,击球平均数,奔跑率等。我们有另一类“保龄球”,其数据成员可能包括诸如被检出的小门数,每局得分,平均小门等。如果是全能手,则“ All-Rounder”类将从“ Batsman”和“ Bowler”类派生。 这可以作为多重继承的真实例子