第六章 继承和面向对象设计
条款35: 使公有继承体现 "是一个" 的含义
原因:“C++面向对象编程中一条重要的规则是:公有继承意味着 "是一个" 。”
条款36: 区分接口继承和实现继承
原因:“定义纯虚函数的目的在于,使派生类仅仅只是继承函数的接口。”“声明简单虚函数的目的在于,使派生类继承函数的接口和缺省实现。”“声明非虚函数的目的在于,使派生类继承函数的接口和强制性实现。”作者再次强调虚函数消耗只在20%的情况下对程序造成巨大影响,其它情况带来的好处会大于消耗。
条款37: 决不要重新定义继承而来的非虚函数
原因:“如果写类D时重新定义了从类B继承而来的非虚函数mf,D的对象就可能表现出精神分裂症般的异常行为。”
条款38: 决不要重新定义继承而来的缺省参数值
原因:“如果缺省参数值被动态绑定,编译器就必须想办法为虚函数在运行时确定合适的缺省值,这将比现在采用的在编译阶段确定缺省值的机制更慢更复杂。”
条款39: 避免 "向下转换" 继承层次
原因:“因为向下转换难看、容易导致错误,而且使得代码难于理解、升级和维护”。“"向下转换" 可以通过几种方法来消除。最好的方法是将这种转换用虚函数调用来代替,第二个方法是加强类型约束,使得指针的声明类型和你所知道的真的指针类型之间没有出入。安全的向下转换”
条款40: 通过分层来体现 "有一个" 或 "用...来实现"
原因:“使某个类的对象成为另一个类的数据成员,从而实现将一个类构筑在另一个类之上,这一过程称为 "分层"(Layering)。”
条款41: 区分继承和模板
原因:“类型T影响类的行为吗?如果T不影响行为,你可以使用模板。如果T影响行为,你就需要虚函数,从而要使用继承。”
条款42: 明智地使用私有继承
原因:“私有继承意味着 "用...来实现"”
条款43: 明智地使用多继承
原因:“MI的出现就象打开了潘朵拉的盒子,带来了单继承中绝对不会存在的复杂性”
条款44: 说你想说的;理解你所说的
原因:想表达的就是所表达的,所表达的就是想表达的。