C++ 私有继承

2025年3月17日 | 阅读 3 分钟

私有继承

私有继承是一种不同的方法,通过它我们可以实现“has-a”关系。借助私有继承,我们可以将类的 protected 和 public 成员转换为类的 private 成员。这意味着在实现私有成员类之后,成员类的所有基类都将成为私有类。但是,我们可以在派生类的成员函数内部实现这些私有类。

让我们通过一个程序来简要理解私有继承。

在上面的程序中,在公共继承中,如果两个类之间的关系设置为私有类,则编译器无法将派生类转换为基类。这就是为什么对象 S 无法调用函数 eat()。

在公共继承的情况下,基类的公共方法成为派生类的公共方法。换句话说,我们可以说派生类借助继承继承了基类的属性。这是一种“IS-A”关系。但在私有继承的情况下,基类的公共方法成为派生类的私有方法,即使基类是 protected 或 public。在这里,派生类不继承基类的属性。

但在私有继承的情况下,我们应该非常小心。私有继承非常令人困惑。这里,“继承”并不意味着“拥有”。假设父母将特殊糖果的秘方交给了孩子,条件是保密。孩子可以给人们提供不同种类的糖果,但不允许分享糖果的配方。借助私有继承,派生类可以由基类实现,但不是由基类拥有。因此,派生类不会向外界展示其接口。唯一向外界展示的是产品。

借助私有继承,类可以通过实现继承。用户可以直接访问类声明,用户是接口的一部分。用户还可以通过类声明间接访问实现类。

示例

输出

Private Inheritance in C++

说明

正如我们从示例中看到的,Car 类最终继承了一个 Engine 组件,例如 汽缸Car 方法可以在内部使用 Engine 方法 getCylinder() 来访问 Engine 组件 cylinder

结论

  • 当你处理两个通过 is-a 不相关的类时,私有继承最有可能是一种合法的设计策略,其中一个类需要访问另一个类的 protected 成员,或者需要重新定义其一个或多个虚函数。
  • 私有继承意味着 **以...方式实现**。它通常不如组合。
  • 如果你让类 D 私有继承自类 B,你这样做是因为你对利用类 B 中可用的一些特性感兴趣,而不是因为类型 BD 的对象之间存在任何概念上的关系。
  • 私有继承在软件 **设计** 期间没有任何意义,只在 **软件实现** 期间有意义。