【问题标题】:What are real-world examples of C++ multiple inheritance? [closed]C++ 多重继承的真实例子是什么? [关闭]
【发布时间】:2011-01-19 22:39:23
【问题描述】:

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

【问题讨论】:

  • +1 在近 20 年的 C++ 编程中我从未遇到过我需要使用多重继承的情况。
  • @Raedwald 这并不意味着有人不应该知道 C++ 中的多重继承是如何工作的。

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


【解决方案1】:

最容易指向iostream,它继承自istreamostreamcincout 分别是 istreamostreamfstream 派生自 iostream

【讨论】:

    【解决方案2】:

    Microsoft 的 ATL(Active Template Library)使用多重继承作为 mixin 类:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 那里有一个教科书的例子,但没有从现实世界中引用。
      【解决方案4】:

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

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

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

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

      我喜欢在示例中使用车辆 - 特别是在两栖车辆中添加。

      【讨论】:

        【解决方案5】:

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

        public class Director
        {
           ................
           double CalculateDividend();
           bool ApproveBudget();
        };
        
        public class Employee
        {
           ................
           double CalculateSalary();
        };
        
        
        public class WorkingDirector: Employee, Director
        {
           ..............
        };
        

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

        在许多情况下,使用多重继承支持也可以更轻松地实现设计模式。

        【讨论】:

        • 这不是一个真实的例子。
        【解决方案6】:

        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——就像基于策略的模板一样,其目的不是创建一个大型的层次结构来断言任何关于层次结构成员之间的关系的东西——相反,它是只是关于创建按需创建大量不相关类的能力。

        【讨论】:

          【解决方案7】:

          如果我们有一个类击球手,它的数据成员像 no of runs,没有。六人制、四人制、击球率、跑动率等。我们还有另一类“投球手”,它可能有数据成员,例如被取走的三柱门数、每轮跑动数、平均三柱门等。作为一个全能选手,“All-Rounder”类将派生自“Batsman”和“Bowler”类。 这可以被引用为多重继承的真实世界示例

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-11-03
            • 1970-01-01
            • 2011-06-05
            • 2011-07-19
            • 2010-12-28
            • 2011-12-10
            • 2017-11-01
            • 1970-01-01
            相关资源
            最近更新 更多