effective C++笔记之条款35: 使公有继承体现“是一个”的含义
2012-03-25 11:38
316 查看
D (Derived)公有继承于B(Base),实际上是:类型D的每一个对象也是类型B的一个对象,但反之不成立;B是一个比D更广泛的概念,D表示一个比B更特定概念;是在声明:任何可以使用类型B的对象的地方,类型D的对象也可以使用,因为每个类型D的对象是一个类型B的对象。相反。如果需要一个类型D的对象,类型B的对象就不行:每个D是一个B,但反之不成立。
1. 如下典型例子:
每个学生是人,但并非每个人使学生。任何对人成立的事实---如都有生日---也对学生成立;任何对学生成立的事实---如都在学校上课----也对人成立。人的概念比学生的概念更广泛;学生是一种特定类型的人。
2. 私有继承是完全另外一回事(42)。
3. Student是一个Person的事实并不说明Student的数组是一个Person数组。(M3)
4. 企鹅与鸟的例子,直接公有继承会出现问题,因为企鹅不会飞,鸟会飞。有两种解决方法,如下所示:
ü 增加一种层次结构:
ü 对penguin重新定义fly函数,使之产生一个运行时错误。
ü 两种方法一种是在编译时检测错误,一种是在运行时发现错误。
5. 正方形与长方形的例子。正方形是一种矩形,但用公有继承来做不适用。最根本的问题在于:对矩形适用的规则(宽度的改变和高度没关系)不适用于正方形(宽度和高度必须相同)。
1. 如下典型例子:
class Person{}; class Student : public Person {}
每个学生是人,但并非每个人使学生。任何对人成立的事实---如都有生日---也对学生成立;任何对学生成立的事实---如都在学校上课----也对人成立。人的概念比学生的概念更广泛;学生是一种特定类型的人。
2. 私有继承是完全另外一回事(42)。
3. Student是一个Person的事实并不说明Student的数组是一个Person数组。(M3)
4. 企鹅与鸟的例子,直接公有继承会出现问题,因为企鹅不会飞,鸟会飞。有两种解决方法,如下所示:
ü 增加一种层次结构:
class Bird{ …}; //没有声明fly函数 class FlyingBird: public Bird { public: virtual void fly(); } class NonFlyingBird : public Bird { … //没有声明fly函数 } ; class Penguin :public NonFlyingBird { … //没有声明fly函数 };
ü 对penguin重新定义fly函数,使之产生一个运行时错误。
void error(const string&msg); class Bird { public: virtual void fly(); }; class Penguin :public Bird { public: virtual void fly() { error(“Penguins can’t fly!”); } //重写基类虚函数 };
ü 两种方法一种是在编译时检测错误,一种是在运行时发现错误。
5. 正方形与长方形的例子。正方形是一种矩形,但用公有继承来做不适用。最根本的问题在于:对矩形适用的规则(宽度的改变和高度没关系)不适用于正方形(宽度和高度必须相同)。
相关文章推荐
- effective c++ 条款35: 使公有继承体现 "是一个" 的含义
- 条款 35: 使公有继承体现"是一个" 的含义
- effective C++笔记之条款40: 通过分层来体现“有一个”或“用…来实现”
- Effective c++ 学习笔记之条款一视C++为一个语言联邦
- Effective C++笔记_条款33确定你的public继承塑模出is-a关系
- effective C++笔记之条款41、42: 区分继承和模板、明智地使用私有继承
- [Effective C++笔记]条款39:明智而审慎地使用private继承
- effective C++笔记之条款23:必须返回一个对象时不要试图返回一个引用
- effective C++笔记之条款11: 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符
- effective C++笔记之条款39: 避免“向下转换”继承层次
- effective C++笔记之条款43: 明智地使用多继承(MI)
- effective C++笔记之条款38: 绝不要重新定义继承而来的缺省参数值
- effective C++笔记之条款36、37: 区分接口继承和实现继承、绝不要重新定义继承而来的非虚函数
- Effective c++ 学习笔记——之条款1:视C++为一个语言联邦
- Effective C++笔记_条款35 考虑virtual 函数以外的其他选择
- Effective STL学习笔记-条款40
- 读书笔记_Effective_C++_条款十:令operator=返回一个reference to *this
- Effective c++ 学习笔记——条款04:确定对象被使用前已先被初始化
- Effective C++——》条款25:考虑写一个不抛出异常的swap函数
- Effective STL学习笔记-条款13|14