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

时间:2011-11-26 20:24:34

标签: c++ inheritance private-inheritance

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

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

我已经看过this question,但我仍然不明白是什么,更何况我应该使用它。

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

4 个答案:

答案 0 :(得分:5)

私有继承模型“是以实现的方式实现的”。意思类似于“has-a”。不同之处是:

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

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

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

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

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

  6. 我个人偏好使用“has-a”作为一般用途,我在排除其他选项后立即使用私有继承。

答案 1 :(得分:2)

要了解私有继承,您必须首先了解 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的成员或朋友中有效。

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

当你从另一个类公开派生一个类时,你会说派生类“是一个”基类。它正是这些类型中的一种。当您私有地从基类派生时,您隐藏了来自外部世界的派生。这意味着您在基类中使用实现来实现派生类,但是没有其他人需要知道它。派生类是“基于”基类实现的。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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