3

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

class Bar { };
class Foo : private Bar { };

我已经看过这个问题,但我仍然不明白它什么,更不用说什么时候应该使用它了。

(与 Java/C# 或类似语言中的功能进行比较也可能会有所帮助。)

4

4 回答 4

5

私有继承模型是“按条款实现的”。含义类似于“has-a”。区别在于:

  1. 使用私有继承,您无需编写包装器(适合懒惰的程序员)

  2. “has-a”允许您更好地控制,您可以只公开接口的子集或更改方法名称,如果您愿意。

  3. 私有继承使异常安全变得困难,请查看异常 C++ 以获取更多信息

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

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

我个人的偏好是将“has-a”用于一般目的,我在排除其他选项后使用私有继承。

于 2011-11-26T20:42:43.817 回答
2

要了解私有继承,首先必须了解公共继承。

如果您有以下情况:

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

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

当您公开从另一个类派生一个类时,您是在说派生类“是”基类。它正是其中一种类型。当您私下从基类派生时,您就是在向外界隐藏派生。这意味着您正在使用基类中的实现来实现派生类,但没有其他人需要知道它。派生类是“根据”基类实现的。

于 2011-11-26T20:42:57.537 回答
1

私有继承是实现类组合的一种方式。此 C++ FAQ 有一整章关于此主题,请参阅http://www.parashift.com/c++-faq-lite/private-inheritance.html

于 2011-11-26T20:32:07.237 回答
0

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

于 2011-11-26T20:28:10.060 回答