史上最简练的effective c++(条款32-40)
条款32-确定你的public继承模塑出is-a关系
dirived class is a based class.
确保public派生类具有基类的所有属性方法
条款33-避免遮掩继承而来的名称
derived class 的成员会覆盖based class 的成员,尽量避免,可以用using和转交函数让父类成员在子类可见
class Derived
{
using Based::func;
void func()
{
based::func();
}
}
条款34-区分接口继承和实现继承
注意pure virtual,virtual函数的继承方式,对应的还有多态这一概念
条款35-考虑virtual函数以外的其它选择
- 将virtual 置于private
- function pointer或者function模板
- 分离出一个类,形成另一个继承体系,易扩展
条款36-绝不重新定义继承而来的non-virtual 函数
既要符合is-a,也要保持based class成员的可见性
条款37-绝不重新定义继承而来的缺省参数值
为了运行期的效率,c++缺省参数是静态绑定,virtual函数是动态绑定,可能发生–调用derived class 的重写的virtual函数,却使用了基类的静态绑定的默认参数
条款38-通过复合塑模出has-a或“根据某物实现出”
不符合is-a关系是=时,利用复合完成has-a,一个类型拥有需要的另一个类型。
条款39-明智而审慎地使用private继承
private 继承不会实现derived 向based的类型转换,因为不符合is-a,逻辑上也不符。private继承意味着只有实现部分被继承,接口被忽略,尽量以复合替代private继承
python没有private这一概念
条款40-明智而审慎地使用多重继承
避免多个based 的成员冲突
多重继承正途:public继承接口类,private继承实现类