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

时间:2011-08-26 18:26:27

标签: c++ inheritance

私人继承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个字段。我何时会使用私有继承,何时使用合成?

谢谢!

1 个答案:

答案 0 :(得分:20)

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

在此复制:

  

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

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

私有继承的合法长期使用是当你想构建一个使用class Fred中的代码的class Wilma时,来自class Wilma的代码需要调用成员函数来自您的新课程Fred。在这种情况下,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";
     }
 };