条款35:使公有继承体现“是一个”的含义.docVIP

条款35:使公有继承体现“是一个”的含义.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 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 { // 企鹅是鸟 ... }; 突然间我们陷入困惑,因为这种层次关系意味着企鹅会飞,而我们知道这不是事实。发生什么了? 造成这种情况,是因为使用的语言(汉语)不严密。说鸟会飞,并不是说所有的鸟会飞,通常,只有那些有飞行能力的鸟才会飞。如果更精确一点,我们都知道,实际上有很多种不会

文档评论(0)

jgx3536 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档