【问题标题】:multiple inheritance is convenient?多重继承方便吗?
【发布时间】:2012-02-16 21:41:53
【问题描述】:

我想实现一个使用一些实用程序类的算法类。 但是一个类可能需要其他实用程序类的成员变量或函数。所以而不是
组合使用继承会更好吗?

class A{
 public:

 void setA(int var){ a = var;}

 int a;

};

class B{
public:
  void foo(int var){ 
      if (var==1){ 
           //bla bla...
      }else{
           //bik bik...
      }
};


class Algo : public A , public B{

public :

  void run(){

    setA(1);
    foo(a);
  }

};

【问题讨论】:

  • 您的问题的答案 100% 取决于设计,像这样的简单示例不足以给出合理的答案。
  • 为什么不使用免费功能?除了不必要的复杂性之外,我没有看到类给你带来任何东西......

标签: c++ oop multiple-inheritance


【解决方案1】:

如果你的类 Algo 应该只从 A 和 B 继承,如果它与 A 和 B 是真正的 IS-A 关系。如果你只是想使用 A 或 B 的功能,请考虑组合(或至少私有继承)。

例如,如果我想创建一个类,并且该类需要做一些日志记录,那么我的类有一个记录器,但它不是 IS-A 记录器。因此我不想从记录器继承,而是使用组合。

【讨论】:

    【解决方案2】:

    在您的情况下,使用继承没有意义,因为Algo 不是AB,它只是使用它们。

    【讨论】:

      【解决方案3】:

      继承旨在表达一种“是一种”关系,并应遵守 Liskov 替换原则。你能说 Algo 是 A 而 Algo 是 B 吗?一般来说,我觉得派生类与基类私有变量混为一谈是个坏主意(您可以将它们设置为受保护的,但它们可能应该是私有的)。你总是可以编写 getter 和 setter。您可能会以多种方式遇到多重继承的麻烦,我认为您现在方便的方法会导致您以不太可维护的方式进行编程。当我需要多态处理类时,我尝试保留继承,在大多数其他情况下,我更喜欢组合。

      【讨论】:

        【解决方案4】:

        我喜欢这种继承的概念:

        通常被认为是通过创建从另一个现有类继承的新类来“重用现有代码”的一种方式。通过这种方式,您可以扩展现有类的功能,而无需接触现有类的代码。但是 Herb Sutter 对继承的使用有一点不同的看法——“继承,不是重用,而是被重用。不要公开继承来重用代码(存在于基类中);按顺序公开继承被重用(通过已经以多态方式使用基础对象的现有代码)。” [C++ 编码标准,p。 64]。他还说“在正确的继承中,派生类对更一般的基本概念的特殊情况进行建模。” [同上,p。 66]

        http://cpp.strombergers.com/

        因此,如果您不需要以多态方式重用代码,或者为 base 制作更特殊的情况,最好使用组合。

        【讨论】:

          【解决方案5】:

          只要您不需要多态性,就不要选择继承而不是组合。在您的情况下,由于您在 A 类和 B 类中没有需要在 Algo 类中更改的虚函数,因此组合可能是更好的设计选择。

          【讨论】:

            猜你喜欢
            • 2016-08-09
            • 1970-01-01
            • 1970-01-01
            • 2023-03-05
            • 2011-12-15
            • 1970-01-01
            • 2015-08-04
            • 2023-04-08
            • 2010-09-27
            相关资源
            最近更新 更多