有效的C++:阻止受保护的继承?

zen*_*ezz 22 c++ inheritance effective-c++

我正在阅读Scott Meyers的Effective C++(第三版),在第32项的一段中:确保公共继承是第151页的"is-a",他发表了评论(我以粗体显示):

这仅适用于公共继承.只有当Student公开派生于Person时,C++才会表现得如我所描述的那样.私有继承意味着完全不同的东西(见第39项),受保护的继承是我今天的意义所在.

问题是:我该如何解释这个评论?迈耶斯试图传达受保护的遗产很少被认为是有用的,应该避免吗?

(我已经阅读了私有,公共和受保护的继承以及C++ FAQ Lite的私有和受保护的继承部分之间区别问题,这两个部分都解释了受保护的继承意味着什么,但是没有让我深入了解何时或为什么它会有用.)

Yoc*_*mer 10

您需要保护的一些场景:

  1. 您有一个基类,其中包含您不知道在外部公开函数的方法,但您知道这对任何派生类都有用.

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

由于多重继承,您可以使用基类的继承类型,并使用现有的逻辑和实现构建更多样化的类.

一个更具体的例子:

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

Observer
Subject
Factory
Run Code Online (Sandbox Code Playgroud)

现在你希望这些都是公开的,因为一般来说,你可以在任何东西上使用这个模式.

但是,使用受保护的继承,您可以创建一个Observer和Subject类,但只创建受保护的工厂,因此工厂部分仅用于继承的类.(只是为示例选择了随机模式)

另一个例子:

让我们说例如你想从一个库类继承(不是我鼓励它).让我们说你想让你自己很酷的扩展std::list<>或"更好" shared_ptr.

您可以从基类(设计为具有公共方法)中受到保护.
这将使您可以选择使用自己的自定义方法,使用类的逻辑,并将逻辑传递给任何派生类.

你可能会使用封装,但是继承遵循IS A的正确逻辑 (或者在这种情况下是IS的A类)

  • 大多数情况可以通过基类中的一些受保护函数来解决.就像Scott Meyers所说的那样,很难找到任何一个很好的例子,你在基类中有公共函数只能传递给派生类. (8认同)
  • 人们总是忘记并非所有代码都是他们的.有遗留代码,您可能希望继承库(std,boost)类.还有其他程序员有其他代码,你不能总是改变.而且你绝对不想为现有代码编写另一个实现. (2认同)

Bo *_*son 5

他并没有完全劝阻受保护的遗产,他只是说他没有找到任何好的用途.我其他地方都没见过任何人.

如果您碰巧找到了几个非常有用的用例,那么您也可能有写一本书的资料.:-)