繁体   English   中英

多重继承方便吗?

[英]multiple inheritance is convenient?

我想实现一个使用一些实用程序类的Algorithm类。 但是一个类可能需要其他实用程序类的成员变量或函数。 所以代替
组成下面使用继承更好吗?

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

};

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

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

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

继承用于表示“是”关系,并且应遵循Liskov替代原则。 您能说Algo是A,Algo是B吗? 总的来说,对于派生类而言,将基类的私有变量混为一谈是一个不好的主意(您可以将它们设置为protected,但它们应该是私有的)。 您始终可以编写getter和setter。 您可能会以多种方式遇到多重继承的麻烦,并且我认为您的方法虽然方便,但现在却会导致您以难以维护的方式进行编程。 当我需要多态处理类时,我尝试保留继承,在大多数其他情况下,我更喜欢组合。

我喜欢这种继承概念:

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

http://cpp.strombergers.com/

因此,如果您不需要多态地重用代码,或者不需要为基础做更多特殊情况,最好使用组合。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM