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
您需要保护的一些场景:
您有一个基类,其中包含您不知道在外部公开函数的方法,但您知道这对任何派生类都有用.
你有一个基类,其成员应该被任何扩展该类的类逻辑地使用,但不应该暴露在外面.
由于多重继承,您可以使用基类的继承类型,并使用现有的逻辑和实现构建更多样化的类.
一个更具体的例子:
你可以创建一些遵循设计模式逻辑的抽象类,假设你有:
Observer
Subject
Factory
Run Code Online (Sandbox Code Playgroud)
现在你希望这些都是公开的,因为一般来说,你可以在任何东西上使用这个模式.
但是,使用受保护的继承,您可以创建一个Observer和Subject类,但只创建受保护的工厂,因此工厂部分仅用于继承的类.(只是为示例选择了随机模式)
另一个例子:
让我们说例如你想从一个库类继承(不是我鼓励它).让我们说你想让你自己很酷的扩展std::list<>或"更好" shared_ptr.
您可以从基类(设计为具有公共方法)中受到保护.
这将使您可以选择使用自己的自定义方法,使用类的逻辑,并将逻辑传递给任何派生类.
你可能会使用封装,但是继承遵循IS A的正确逻辑 (或者在这种情况下是IS的A类)