Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多重继承方便吗?_C++_Oop_Multiple Inheritance - Fatal编程技术网

C++ 多重继承方便吗?

C++ 多重继承方便吗?,c++,oop,multiple-inheritance,C++,Oop,Multiple Inheritance,我想实现一个算法类,它使用一些实用程序类。 但一个类可能需要另一个实用类的成员变量或函数。所以与其说是 组合下面使用继承更好吗 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 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/St>关系A和B。如果你只是想使用A或B的功能,不如考虑合成(或者至少私有继承)。


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

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

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

我喜欢继承的这个概念:

通常被认为是通过创建从另一个现有类继承的新类来“重用现有代码”的一种方法。通过这种方式,您可以扩展现有类的功能,而不涉及现有类的代码。但是Herb Sutter对继承的使用有一点不同的看法--“继承,不是为了重用,而是为了被重用。不要公开继承以重用代码(存在于基类中);公开继承以被重用(通过已经多态地使用基对象的现有代码)。”[C++编码标准,第64页]。他还说,“在正确的继承中,派生类为更一般的基概念的特例建模。”[同上,第66页]


所以,如果您不需要多态性地重用代码,或者不需要为base设置更特殊的情况,那么最好使用组合。

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

您的问题的答案是100%依赖于设计,像这样的简单示例不足以给出合理的答案。为什么不使用自由函数?在这里,除了不必要的复杂性,我看不到课程能给你带来什么。。。