- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C程序语言14B
C++程序设计实用教程 清华大学出版社 2008 第14章 继承与多态性 继承与派生概述 14.1.1 抽象与具体 14.1.2 组合与继承 14.1.3 派生类成员的访问属性 派生类对象的构造 14.2.1 派生类对象的构造与析构 14.2.2 派生类对象的空间 14.2.3 派生类对基类的赋值兼容性 多态性 *多重继承 构造顺序 小结 14.3 多态性 上一节中,介绍了继承与派生的概念。程序中留下了三个伏笔(最先讨论第三方面的内容): 基类Student中的成员函数Tuition是无用的 的确,在上面的程序中这个函数是可以去掉的。 但,不打算去掉它而是改变其形式(参见第14.3.4小节) 重载插入运算符时没有直接利用友元的身份访问对象的数据成员,而是调用成员函数Show Show函数的形式参数虽可理解, 但有些怪异(原因参见第14.3.2小节)。 如下两个函数的函数体语句相同,形参不同 void UGOffice(Undergraduate x, double credit); void PGOffice(Postgraduate x, double credit); 希望将形参改成基类的引用(赋值兼容!) 14.3 多态性 void UGOffice(Undergraduate x, double credit); void PGOffice(Postgraduate x, double credit); 分别代表财务部门两个不同的服务窗口,本科生、研究生不能去错服务窗口。 倘若学校的学生有更多的层次(如还有专科生、进修学生和博士研究生等),则要设置更多的专门窗口,岂不是“机构臃肿”。 学校的财务部门能否做到“接待所有的学生,按具体学生办理相关事情” void Office(Student x, double credit); void Office(Student *x, double credit); “来者都是学生”,再视“具体对象”分别处理。 多态性 ——— 问题的提出 即要求只设计一个统一的函数处理各类学生 由于需要操作实参对象,故双向、或间接双向传递对象 void Office(Student x, double credit){ x.SetCredit(credit); x.Tuition(); cout x endl;} void Office(Student *x, double credit){ x-SetCredit(credit); x-Tuition(); cout x endl;} 是否可行,测试之…… 从运行结果可知 Office函数体内无法区分实参是“本科生”还是“研究生”,仅将他们作为“学生”,而无法处理实参对象的差异。 静态多态性 ——— 先期联编 在编译阶段就完全确定所要调用的函数,称为先期联编 函数重载、函数模板 先期联编实现的多态性称为静态多态性 本质上生成、编译了多个不同的重载函数 动态多态性 ——— 迟后联编 迟后联编 迟后联编所调用的函数不是在编译阶段确定的, 而是在程序运行过程中根据实际对象动态地确定的。 迟后联编实现动态多态性或运行时的多态性。 运行时的多态性是面向对象程序设计的一个 重要特征。 这种特性的实现机制是虚函数。 14.3.1 虚函数 设计一个类时,使用保留字virtual可将成员函数声明为虚函数。 对于含有虚函数、纯虚函数的类 编译系统为该类建一个虚函数表,它是一个指针数组,存放每个虚函数的入口地址,供该类的所有对象共享。 同时在类中悄悄添加一个特殊指针成员指向该虚函数表。 每当对象调用成员函数时,将首先访问该特殊指针,找到虚函数表,最后找到所要执行的函数。实现运行时的多态性。 显然,“将方便让给程序员,将困难留给编译器”。 采用指针或引用操作,程序的执行效率依然很高。 14.3.1 虚函数 程序需要修改处 仅需将基类Student中两个函数声明成虚函数(头文件) virtual void Tuition(); // 计算学费 virtual void Show(ostream out) const; // 输出信息 此后,有 派生类Undergraduate和Postgraduate自动继承基类的这两个虚函数。 系统将为上述3个类分别各建立虚函数表,存储各自的虚函数入口地址; 同时在各类中悄悄添加一个指针成员指向该虚函数表; 对象调用函数时将首先查虚函数表,呈现动态多态性。 14.3.1 虚函数 例如:若创建对象 Undergraduate s; Postgraduate g; 则,对
文档评论(0)