除了教科书的例子之外,在现实世界中,是否有理由在 C++ 中使用多重继承(其中不止一个基类不是纯接口)?
除了教科书的例子之外,在现实世界中,是否有理由在 C++ 中使用多重继承(其中不止一个基类不是纯接口)?
最容易指向的是 iostream
,它继承自 istream
和 ostream
。 cin
和 cout
分别是 istream
和 ostream
,但是 fstream
派生自 iostream
。
微软的ATL(Active Template Library)使用多重继承作为混合类:
在我看来,这是有争议的。在使用模板之前,有很多情况需要使用它。基本上,您可以像使用模板的策略类一样使用基类。例如,考虑以下模板:
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 -- 就像使用基于策略的模板一样,意图并不是创建一个关于层次结构成员之间关系的大层次结构 -- 而是仅仅为了创建能够按需求创建各种无关类的能力。
};
多重继承确实有其用武之地,它可以非常有用。作为一般准则,基类应尽可能是抽象的,这意味着您不应该能够从中创建对象,但没有任何阻止您从具体类继承。它绝对是一个优点,因为您可以利用来自基类的继承实现。iostream上的一个答案的示例就是一个很好的例子。另一个例子可能是模拟既是员工又是业主/董事的企业,并将其建模为
public class Director
{
................
double CalculateDividend();
bool ApproveBudget();
};
public class Employee
{
................
double CalculateSalary();
};
public class WorkingDirector: Employee, Director
{
..............
};
我在“现实世界”中使用了多重继承——在一份工作中,我参与编写了一个映射应用程序。
不幸的是,我无法记住确切的例子,这让我感到非常沮丧。
然而,这里有一篇有趣的文章,介绍了需要考虑的要点以及可供考虑使用的替代模式或解决方案:
http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.2
我喜欢使用车辆作为示例,特别是加入两栖车辆。