Effective c++ 条款32:确定你的public继承塑模出is-a关系

如果你令class D以public形式继承**class B,你便是告诉C++编译器说,每一个类型为D的对象同时也是一个类型为B的对象,反之不成立。public继承就意味着is-a,代表着**B对象可派上用场的任何地方,D对象一样可以派上用场。因为每一个D对象都是一种(是一个)B对象,但是反之并不成立。然而这个论点只对public继承才成立。
有时候也许我们设计了一个Base类,但其子类不一定都应该有该Base类的某些性质,此时我们有两种做法:一种是不为Base类和子类加入这个性质,而另一种做法就是让子类重新定义不该有的函数时,使其产生一个运行期错误。这两种的差异就是,前者可由编译器强制实施,而后者只有运行期才能检测出来。条款18说过,好的接口可以防止无效的代码通过编译,因此你应该宁可采取“在编译期拒绝行为”的设计。
is-a并非是唯一存在于classes之间的关系,另两个常见的关系是has-a和is-implemented-in-terms-of。

猜你喜欢

转载自blog.csdn.net/unirrrrr/article/details/81394716