c++ - 有效 C++ : discouraging protected inheritance?

标签 c++ inheritance effective-c++

我正在阅读 Scott Meyers 的 Effective C++(第三版),并在 第 32 项:确保公共(public)继承是页面上的“is-a” 中的一段中151 他发表评论(我用粗体表示):

This is true only for public inheritance. C++ will behave as I've described only if Student is publicly derived from Person. Private inheritance means something entirely different (see Item 39), and protected inheritance is something whose meaning eludes me to this day.

问题:我应该如何解释这条评论? Meyers 是否试图传达 protected 继承很少被认为有用并且应该避免?

(我已阅读问题 Difference between private, public, and protected inheritance以及 C++ FAQ Lite's private and protected inheritance section ,两者都解释了 protected 继承的含义,但并没有让我深入了解它何时或为什么有用。)

最佳答案

您想要保护的一些场景:

  1. 您有一个基类,其中包含您知道永远不想将功能公开到外部的方法,但您知道它对任何派生类都有用。

  2. 你有一个基类,它的成员应该被任何扩展该类的类在逻辑上使用,但绝不应该暴露在外面。

多亏了多重继承,您可以使用基类的继承类型,并使用现有的逻辑和实现构造一个更加多样化的类。

一个更具体的例子:

您可以创建一些遵循设计模式逻辑的抽象类,假设您有:

Observer
Subject
Factory

现在您希望将这些全部公开,因为一般来说,您可以在任何东西上使用该模式。

但是,使用 protected 继承,您可以创建一个观察者和主题的类,但只有 protected 工厂,因此工厂部分仅用于继承的类。 (只是为示例选择了随机模式)

另一个例子:

例如,假设您想从库类继承(我不鼓励这样做)。假设您想制作自己的 std::list<> 的酷扩展或“更好”shared_ptr .

您可以从基类(设计为具有公共(public)方法) protected 地派生。
这将使您可以选择使用自己的自定义方法、使用类的逻辑并将逻辑传递给任何派生类。

您或许可以改用封装,但继承遵循 IS A 的正确逻辑 (或者在这种情况下是一种 A)

关于c++ - 有效 C++ : discouraging protected inheritance?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6484306/

相关文章:

c++ - 你能定义 main() 来接收比 argc/argv 参数更多的参数吗?

c++ - Boost lib 似乎缺少 hpp 文件?

java - JQL ORDER BY 子句和继承

postgresql - Postgres 数据库继承,子表索引

c++ - 为什么 static_cast(*this) 到基类会创建一个临时拷贝?

c++ - 如何理解 Effective C++ 中的 "implementations of virtual constructors"

c++ - CMake 找不到 Visual C++ 编译器

c++ - Win32 DLL 没有返回正确的数据

java - 私有(private)变量的继承

c++ - 对引用计数感到困惑