什么是私有继承,它解决了哪些问题

What is private inheritance, and what issues(s) does it address?

本文关键字:解决 问题 继承 什么      更新时间:2023-10-16

谁能解释一下c++中的私有/保护继承到底是为了什么,以及它打算解决什么问题?

class Bar { };
class Foo : private Bar { };
我已经看到了这个问题,但我仍然不明白它是什么,更不用说什么时候应该使用它了。

(与Java/c#或类似语言的特性进行比较也会有所帮助)

私有继承模型"is- implementation -in-terms "。它的意思与"has-a"类似。不同之处在于:

  1. 使用私有继承,您不需要编写包装器(对于懒惰的程序员来说很好)

  2. "has-a"允许你更好的控制,你可以只暴露接口的一个子集,或者如果你喜欢改变方法名。

  3. 私有继承使得异常安全变得困难,更多信息请看异常c++

  4. 当你想使用基类中受保护的成员时,你确实需要私有继承。

  5. 有时私有继承在mix-in类中使用(Effective c++内存管理章节)

我的个人偏好是在一般情况下使用"has-a",我在排除其他选项后才使用私有继承。

要理解私有继承,必须首先理解public继承。

如果您有以下内容:

class Base
{
public:
  void SomeFunc();
};
class Pub : public class Base {};

这意味着允许以下操作:

Pub aPub;
Base &basePart = aPub;

您可以接受派生类并获得基类的引用(或指针)。你也可以这样做:

Pub aPub;
aPub.SomeFunc();

Base中是公开的,在Pub中也是公开的。

公共继承意味着任何地方的任何人都可以访问被驱动类的基类组件。

私有继承有点不同:

class Priv : private class Base {};
Priv aPriv;
Base &basePart = aPriv;

最后一行通常不能工作。私有继承意味着只有可以执行此操作的函数和类是Priv的直接成员或Priv的友元。如果在Priv成员或友元之外编写此代码,则将无法编译

同样:

Priv aPriv;
aPriv.SomeFunc();

仅在Priv的成员或友元内有效。

私有继承意味着只有派生类的成员或友元才能访问基类组件。所以成员函数可以调用派生类的基类部分,但是外部没有人可以。

当你公开地从另一个类派生出一个类时,你说这个派生类"是"一个基类。这正是其中一种类型。当您私下地从基类派生时,您将对外部世界隐藏派生。这意味着您正在基类中使用实现来实现派生类,但其他人不需要知道它。派生类是根据基类"实现"的。

私有继承是实现类组合的一种方式。

c++常见问题解答有一整章是关于这个主题的,请参阅http://www.parashift.com/c++-faq-lite/private-inheritance.html。

它不能解决问题,但它允许您更多的代码设计选项,在这种情况下,Bar中的所有方法在Foo中都是私有的。