Effective C++ Item 34 Differentiate between inheritance of interface and inheritance of implementation
2014-03-01 13:01
288 查看
1. 成员函数的接口总是被继承. 如 Item32 所说, public 意味着 is-a, 所以对 base class 为真的任何事情对 derived class 也为真
2. 声明一个 pure virtual 函数的目的是为了让 derived class 只继承其接口
但令人意外的是, 我们竟然可以为 pure virtual 函数提供定义. 这有另一种用处, 即作为 default 实现
3. 声明 impure virtual 函数的目的是为了让 derived class 继承接口和默认实现
这里会出现一个特殊情况, 如果有些子类(多数子类)欢迎默认实现而少数子类却不欢迎呢? 一个可行的解法是仍然继承但对那些不欢迎默认实现的子类重载 virtual function. 当然这是一个解法, 我不反对. 不过由 Item 18 的条款, "make interfaces easy to use correctly and hard to use incorrectly", 我们应该考虑某些粗心的程序员会忘记重载而导致不希望被看到的后果, 所以我们使用一种策略, "接口与缺省实现应该分开"
接口与缺省实现应该分开意味着我们需要另外定义一个函数作为缺省的实现, 然后再子类调用它. 但这时又会有反对者跳出来说, 那不还要起个名字么? 起名字这事最讨厌了
好的, 起名字讨厌. 那么我们就可以利用 pure virtual 函数可以提供定义这么一个特点, 巧妙的完成任务
2. 声明一个 pure virtual 函数的目的是为了让 derived class 只继承其接口
但令人意外的是, 我们竟然可以为 pure virtual 函数提供定义. 这有另一种用处, 即作为 default 实现
3. 声明 impure virtual 函数的目的是为了让 derived class 继承接口和默认实现
这里会出现一个特殊情况, 如果有些子类(多数子类)欢迎默认实现而少数子类却不欢迎呢? 一个可行的解法是仍然继承但对那些不欢迎默认实现的子类重载 virtual function. 当然这是一个解法, 我不反对. 不过由 Item 18 的条款, "make interfaces easy to use correctly and hard to use incorrectly", 我们应该考虑某些粗心的程序员会忘记重载而导致不希望被看到的后果, 所以我们使用一种策略, "接口与缺省实现应该分开"
接口与缺省实现应该分开意味着我们需要另外定义一个函数作为缺省的实现, 然后再子类调用它. 但这时又会有反对者跳出来说, 那不还要起个名字么? 起名字这事最讨厌了
好的, 起名字讨厌. 那么我们就可以利用 pure virtual 函数可以提供定义这么一个特点, 巧妙的完成任务
class ModeA: public Airplane { public: virtual void fly(const Airport& destination) { Airplane::fly(destination); } };
相关文章推荐
- 【排序】快速排序C++实现总结
- C/C++ 调试技巧
- Effective C++ Item 33 Avoid hiding inherited names
- 打印一个九九乘法表
- C++之类,类的数组,一次实例化多个类的实例。
- 高级算法课程(一):模拟退火算法SA()及其C++代码
- C++拷贝构造函数及重写operator =的区别
- C语言虐心记
- C语言实现继承和多态
- C语言中char变量详解
- 【c++】大数相加
- C++编译器与链接器工作原理
- C++中的前置声明
- C与C++的区别,枚举类型enum
- SEH——Structured Exception Handling(结构化异常处理)
- c++容器总结
- C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)
- UVA 10106高精度乘法
- gsoap编译工具的安装与使用(二)----工具的使用及问题的解决
- C语言条件编译及编译预处理阶段