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

Ron*_*n_s 17 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 */
};
Run Code Online (Sandbox Code Playgroud)

C将无法使用任何B字段.我何时会使用私有继承,何时使用合成?

谢谢!

Alo*_*ave 20

这个C++ FAQ条目恰当地回答了你的问题.

在这里复制它:

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

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

私有继承的合法,长期使用是当你想构建一个class Fred使用a 中的代码时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";
     }
 };
Run Code Online (Sandbox Code Playgroud)

  • 我真的不明白“因为它增加了有人会改变会破坏你的代码的东西的可能性。”。是不是和公共继承一样?如果代码因受保护成员的更改而中断,这不是基类的错,而不是派生类的错吗? (2认同)