【问题标题】:What is private inheritance, and what issues(s) does it address?什么是私有继承,它解决了哪些问题?
【发布时间】:2011-11-26 20:24:34
【问题描述】:

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

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

我已经看过this question,但我仍然不明白它是什么,更不用说什么时候该使用它了。

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

【问题讨论】:

  • 顺便说一句,大多数时候你会想到使用私有继承,忘记它并使用组合。

标签: c++ inheritance private-inheritance


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 说得好。你有 Exceptional C++ 的特定章节参考吗?
  • 哇,我想我现在明白它的作用了——这是我一直希望我能做的事情,而不是编写一个成熟的包装器,但一直没能做到! :P +1
  • @sehe 本书第 11-12 章
  • 私有继承使异常安全变得困难”与什么相比?
  • 与组合相比,请参阅 Exceptional c++ 第 11 章和第 12 章
【解决方案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 的成员或朋友。

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

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

【讨论】:

  • +1 增加一些价值 (you are hiding the derivation from the outside world)。然而,它的措辞本可以更切中要害。另外,我很确定@Mehrdad 确实已经了解公共继承 :)
【解决方案3】:

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

【讨论】:

  • 您可以将链接作为评论发布。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2011-04-04
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    相关资源
    最近更新 更多