除了教科书示例 - 在现实世界中 - 在C ++中使用多重继承(其中多个基类不是纯接口)是否有意义?
答案 0 :(得分:11)
例如,使用Policy-based design时非常常见。
答案 1 :(得分:4)
最容易指向iostream
,其继承自istream
和ostream
。 cin
和cout
分别为istream
和ostream
,但fstream
来自iostream
。
答案 2 :(得分:3)
Microsoft的ATL(活动模板库)使用多重继承作为mixin类:
答案 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(); }
};
在这两种情况下,您基本上都是将“策略”的实例嵌入到新对象中。由于我们使用私有继承,因此不关心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”类派生。 这可以作为多重继承的真实例子