为什么我们实际上需要 C 中的 Private 或 Protected 继承?

新手上路,请多包涵

在 C++ 中,我想不出我想从基类继承私有/受保护的情况:

 class Base;
class Derived1 : private Base;
class Derived2 : protected Base;

真的有用吗?

原文由 Gal Goldman 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 595
2 个回答

当您想要访问基类的某些成员但又不想在类接口中公开它们时,它很有用。私有继承也可以看作是某种组合: C++ faq-lite 给出了下面的例子来说明这个语句

class Engine {
 public:
   Engine(int numCylinders);
   void start();                 // Starts this Engine
};

class Car {
  public:
    Car() : e_(8) { }             // Initializes this Car with 8 cylinders
    void start() { e_.start(); }  // Start this Car by starting its Engine
  private:
    Engine e_;                    // Car has-a Engine
};

为了获得相同的语义,您还可以编写 car 类,如下所示:

 class Car : private Engine {    // Car has-a Engine
 public:
   Car() : Engine(8) { }         // Initializes this Car with 8 cylinders
   using Engine::start;          // Start this Car by starting its Engine
};

但是,这种做法有几个缺点:

  • 你的意图不太清楚
  • 它可能导致滥用多重继承
  • 它破坏了 Engine 类的封装,因为您可以访问其受保护的成员
  • 你可以覆盖引擎虚拟方法,如果你的目标是一个简单的组合,这是你不想要的

原文由 Luc Touraille 发布,翻译遵循 CC BY-SA 2.5 许可协议

当您处理与 is-a 不相关的两个类时,私有继承很可能是一种合法的设计策略,其中一个需要访问另一个的受保护成员或需要重新定义其一个或多个虚函数。

来自 Scott Meyers Effective C++ 3rd Edition page in 191。

原文由 HenryTien 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题