* 组合与继承
** 继承 表示is a
当子类继承基类时, 子类包含了父基类所有数据及操作的定义.
C++ 实践中, 继承主要用于两种场合: 实现继承, 子类继承父类的实现代码(这样可以减少代码量); 接口继承 (interface inheritance), 子类
仅继承父类的方法名称(规范接口,以后有新的业务类型,以前核心逻辑不需要进行修改).
多重继承:真正使用到情况很少,只有一个是非抽象类(属性),别都类似纯接口(行为)
优点:
实现继承通过原封不动的复用基类代码减少了代码量. 由于继承是在编译时声明, 程序员和编译器都可以理解相应操作并发现错误.
从编程角度而言, 接口继承是用来强制类输出特定的 API. 在类没有实现 API 中某个必须的方法时, 编译器同样会发现并报告错误.
缺点:
对于实现继承, 由于子类的实现代码散布在父类和子类间之间, 要理解其实现变得更加困难. 子类不能重写父类的非虚函数, 当然也就不能修改其实现. 基类也可能定义了一些数据成员, 还要区分基类的实际布局.
结论:
所有继承必须是 public 的. 如果你想使用私有继承, 你应该替换成把基类的实例作为成员对象的方式.
不要过度使用实现继承. 组合常常更合适一些. 尽量做到只在 “是一个” (“is-a”注: 其他 “has-a” 情况下请使用组合) 的情况下使用继承;
必要的话, 析构函数声明为 virtual. 如果你的类有虚函数, 则析构函数也应该为虚函数. 注意 数据成员在任何情况下都必须是私有的.
当重载一个虚函数, 在衍生类中把它明确的声明为 virtual. 理论依据: 如果省略 virtual 关键字, 代码阅读者不得不检查所有父类, 以判断该函数是否是虚函数.
** 组合 表示 has-a
//TODO
典型应用:adapter** 继承 表示is a
当子类继承基类时, 子类包含了父基类所有数据及操作的定义.
C++ 实践中, 继承主要用于两种场合: 实现继承, 子类继承父类的实现代码(这样可以减少代码量); 接口继承 (interface inheritance), 子类
仅继承父类的方法名称(规范接口,以后有新的业务类型,以前核心逻辑不需要进行修改).
多重继承:真正使用到情况很少,只有一个是非抽象类(属性),别都类似纯接口(行为)
优点:
实现继承通过原封不动的复用基类代码减少了代码量. 由于继承是在编译时声明, 程序员和编译器都可以理解相应操作并发现错误.
从编程角度而言, 接口继承是用来强制类输出特定的 API. 在类没有实现 API 中某个必须的方法时, 编译器同样会发现并报告错误.
缺点:
对于实现继承, 由于子类的实现代码散布在父类和子类间之间, 要理解其实现变得更加困难. 子类不能重写父类的非虚函数, 当然也就不能修改其实现. 基类也可能定义了一些数据成员, 还要区分基类的实际布局.
结论:
所有继承必须是 public 的. 如果你想使用私有继承, 你应该替换成把基类的实例作为成员对象的方式.
不要过度使用实现继承. 组合常常更合适一些. 尽量做到只在 “是一个” (“is-a”注: 其他 “has-a” 情况下请使用组合) 的情况下使用继承;
必要的话, 析构函数声明为 virtual. 如果你的类有虚函数, 则析构函数也应该为虚函数. 注意 数据成员在任何情况下都必须是私有的.
当重载一个虚函数, 在衍生类中把它明确的声明为 virtual. 理论依据: 如果省略 virtual 关键字, 代码阅读者不得不检查所有父类, 以判断该函数是否是虚函数.