有效的C ++:不鼓励受保护的继承?
我正在阅读Scott Meyers的Effective C ++ (第三版),并且在第32项的一段中:确保公共继承是“is-a”(第151页),他发表了评论(我用粗体表示):
这只适用于公共继承。 只有当Student是从Person公开派生时,C ++才会像我所描述的那样工作。 私有继承意味着完全不同的东西(参见条款39), 并且受保护的继承是其含义直到今天都没有意义的东西。
问题 :我应该如何解释这个评论? 梅尔斯是否试图传达那种被保护的遗传很少被认为是有用的,应该避免?
(我已经读过了私人,公共和受保护继承之间的差异以及C ++ FAQ Lite的私有和受保护继承部分,这两者都解释了受保护继承的含义,但是并没有让我深入了解何时或为什么会很有用。)
一些你想要保护的场景:
你有一个基类,其中你知道你永远不想公开外部功能,但是你知道对任何派生类都有用。
您有一个基类,其成员应该由任何扩展该类的类在逻辑上使用,但不应暴露在外。
由于多重继承,您可以利用基类的继承类型来构建一个更加多样化的类,并使用现有的逻辑和实现。
一个更具体的例子:
你可以创建一些遵循设计模式逻辑的抽象类,可以说你有:
Observer
Subject
Factory
现在你想让这些都公开,因为一般来说,你可以在任何事物上使用这个模式。
但是,对于受保护的继承,您可以创建一个类为Observer和Subject的类,但仅限于受保护的工厂,因此工厂部分仅用于继承类。 (只为示例选择了随机模式)
另一个例子:
比方说,例如你想从图书馆类继承(不是我鼓励它)。 比方说,你想让你自己的std::list<>
或者更好的shared_ptr
扩展。
你可以从基类(它被设计为具有公共方法)中得到保护。
这将使您可以选择使用自己的自定义方法,使用类的逻辑,并将逻辑传递给任何派生类。
你可以使用封装来代替,但是继承遵循IS A的正确逻辑(或者在这种情况下是IS类型的A)
他并不是完全不鼓励受保护的继承,他只是说他没有找到任何用处。 我在其他地方还没有见过任何人。
如果你碰巧找到几个非常有用的用例,那么你可能也有材料来写一本书。 :-)
是和不是。 我自己认为受保护的继承也是一个不好的功能。 它基本上将所有基类的公共和受保护成员作为受保护的成员进行导入。
我通常会避免受保护的成员,但在编译器链接时间最优化需要极高效率的最低级别上,它们非常有用。 但是,构建于此的所有东西都不应该混淆原始基类的(数据)成员,而应该使用接口。
我认为Scott Meyer想说的是,如果解决了问题,仍然可以使用受保护的继承,但请确保使用注释来描述继承,因为它在语义上不明确。
链接地址: http://www.djcxy.com/p/78561.html