- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
条款35:使公有继承体现“是一个”的含义
条款35:使公有继承体现“是一个”的含义
条款35: 使公有继承体现 是一个 的含义
在Some Must Watch While Some Must Sleep( W. H. Freeman and Company, 1974)一书中,William Dement讲了一个故事,故事说的是他如何让学生们记住他的课程中最重要的部分。据说,,他告诉他的学生,一般的英国学生除了记得Hastings战役发生在1066年外,再也不记得其它历史。, 如果一个小孩不记得别的历史, Dement强调说,也一定记得1066这个日子。 但对于他班上的学生来说,只有很少一些话题可以引起他们的兴趣,比如,安眠药会引起失眠之类。所以他哀求他的学生,即使忘掉他在课堂上讲授的其它任何东西,也要记住那些仅有的几个重要的历史事件。而且,他在整个学期不停地对学生灌输这一基本观点。
学期结束时,期末考试的最后一道题是,请写下你从课程中学到的一辈子都会记住的东西。当Dement评改试卷时,他大吃一惊。几乎所有学生都写下了 1066。
所以,在这里我也以极度颤抖的声音告诉你,C++面向对象编程中一条重要的规则是:公有继承意味着 是一个 。一定要牢牢记住这条规则。
当写下类D(Derived )从类B(Base)公有继承时,你实际上是在告诉编译器(以及读这段代码的人):类型D的每一个对象也是类型B的一个对象,但反之不成立;你是在说:B表示一个比D更广泛的概念,D表示一个比B更特定概念;你是在声明:任何可以使用类型B的对象的地方,类型D的对象也可以使用,因为每个类型D的对象是一个类型B的对象。相反,如果需要一个类型D的对象,类型B的对象就不行:每个D 是一个 B, 但反之不成立。
C++采用了公有继承的上述解释。看这个例子:
class Person { ... };
class Student: public Person { ... };
从日常经验中我们知道,每个学生是人,但并非每个人是学生。这正是上面的层次结构所声明的。我们希望,任何对 人 成立的事实 ---- 如都有生日 ----也对 学生 成立;但我们不希望,任何对 学生 成立的事实 ---- 如都在某一学校上学 ----也对 人 成立。人的概念比学生的概念更广泛;学生是一种特定类型的人。
在C++世界中,任何一个其参数为Person类型的函数(或Person的指针或Person的引用)可以实际取一个Student对象(或Student的指针或Student的引用):
void dance(const Person p); // 任何人可以跳舞
void study(const Student s); // 只有学生才学习
Person p; // p是一个人
Student s; // s是一个学生
dance(p); // 正确,p是一个人
dance(s); // 正确,s是一个学生,
// 一个学生是一个人
study(s); // 正确
study(p); // 错误! p不是学生
只是公有继承才会这样。也就是说,只是Student公有继承于Person时,C++的行为才会象我所描述的那样。私有继承则是完全另外一回事(见条款42),至于保护继承,好象没有人知道它是什么含义。另外,Student 是一个 Person的事实并不说明Student的数组 是一个 Person数组。关于这一话题的讨论参见条款M3。
公有继承和 是一个 的等价关系听起来简单,但在实际应用中,可能不会总是那么直观。有时直觉会误导你。例如,有这样一个事实:企鹅是鸟;还有这样一个事实:鸟会飞。如果想简单地在C++中表达这些事实,我们会这样做:
class Bird {
public:
virtual void fly(); // 鸟会飞
...
};
class Penguin:public Bird { // 企鹅是鸟
...
};
突然间我们陷入困惑,因为这种层次关系意味着企鹅会飞,而我们知道这不是事实。发生什么了?
造成这种情况,是因为使用的语言(汉语)不严密。说鸟会飞,并不是说所有的鸟会飞,通常,只有那些有飞行能力的鸟才会飞。如果更精确一点,我们都知道,实际上有很多种不会
您可能关注的文档
- 培训smt技术实训.doc
- 培训市场,谁能赢得更多奶酪.doc
- 培训教材之太阳电池基本知识.doc
- 培训计划表样表.doc
- 培训迁移影响因素及其对策分析.doc
- 基于IE的远程控制rmtSvc&vIDC 2.4.7.doc
- 基于_项目引领_任务驱动_的高职_单片机应用技术_课程开发实践.doc
- 基于企业核心竞争力的薪酬激励体系设计.doc
- 基于决策树方法的分类规则的挖掘.doc
- 基于改进遗传算法的套筒滚子链传动优化设计_张元通.doc
- 新解读《GB 41618 - 2022石灰、电石工业大气污染物排放标准》.docx
- 新解读《GB_T 41344.3 - 2022机械安全 风险预警 第3部分:分级》.docx
- 新解读《GB_T 19335-2022一次性使用血路产品 通用技术条件》.docx
- 新解读《GB_T 30283-2022信息安全技术 信息安全服务 分类与代码》.docx
- 新解读《GB_T 41509-2022绿色制造 干式切削工艺性能评价规范》.docx
- 新解读《GB_T 41575-2022未成年人互联网不健康内容分类与代码》.docx
- 新解读《GB_T 42015-2022信息安全技术 网络支付服务数据安全要求》.docx
- 2025三支一扶通关题库及参考答案详解(典型题).docx
- 新解读《GB_T 17258 - 2022汽车用压缩天然气钢瓶》.docx
- 新解读《GB_T 19608.1 - 2022特殊环境条件分级 第1部分:干热》.docx
文档评论(0)