私有继承 VS 组合:何时使用哪个?

Posted

技术标签:

【中文标题】私有继承 VS 组合:何时使用哪个?【英文标题】:Private inheritance VS composition : when to use which? 【发布时间】:2011-08-26 18:26:27 【问题描述】:

私有继承 VS 组合。

我有点困惑何时使用它们。由于私有继承在某种程度上密封了继承链,给定:

class A

private:
    int z;
protected:
    int y;
public:
    int x;
;

class B : private A

    /* B's data members and methods */
    /* B has access only to A's public and protected */
;

class C : public B

    /* can access no fields of B */
;

C 将无法使用B 的任何字段。什么时候使用私有继承,什么时候使用组合?

谢谢!

【问题讨论】:

请用您要询问的特定编程语言标记问题。 When to use C++ private inheritance over composition?的可能重复 【参考方案1】:

This C++ FAQ entry 恰当地回答您的问题。

在这里复制它:

尽可能使用组合,必要时使用私有继承。

通常您不想访问太多其他类的内部,而私有继承为您提供了一些额外的权力(和责任)。但是私有继承并不邪恶。它的维护成本更高,因为它增加了有人更改会破坏您的代码的东西的可能性。

私有继承的合法长期用途是当您想要构建一个使用class Wilma 中的代码的class Fred,并且来自class Wilma 的代码需要调用来自您的新类的成员函数,@ 987654325@。在这种情况下,Fred 调用Wilma 中的非虚拟对象,Wilma 调用本身(通常是纯虚拟对象),它们被Fred 覆盖。这对于合成来说会更难。

class Wilma 
 protected:
   void fredCallsWilma()
     
       std::cout << "Wilma::fredCallsWilma()\n";
       wilmaCallsFred();
     
   virtual void wilmaCallsFred() = 0;   // A pure virtual function
 ;

 class Fred : private Wilma 
 public:
   void barney()
     
       std::cout << "Fred::barney()\n";
       Wilma::fredCallsWilma();
     
 protected:
   virtual void wilmaCallsFred()
     
       std::cout << "Fred::wilmaCallsFred()\n";
     
 ;

【讨论】:

我不太明白“因为它增加了某人更改某些内容会破坏您的代码的可能性。”。与公共继承不一样吗?如果代码由于受保护成员的更改而中断,难道不是基类的错,而不是派生的错吗?

以上是关于私有继承 VS 组合:何时使用哪个?的主要内容,如果未能解决你的问题,请参考以下文章

关于组合 继承

面向对象——继承与组合

javascript继承

10ReactJs基础知识10--组件组合 vs 继承

桥接模式

Java:Effective java学习笔记之 复合优先于继承