第六章_多态性和虚函数1.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第六章 多态性与虚函数 封装性和继承性为软件设计提供了可靠的安全性和良好的结构层次。在此基础上,多态性使软件中的对象行为更加符合软件所模拟的客观世界中对象行为的多样性,为软件设计中的功能实现和任务调度提供了灵活性。 多态性是指当不同的对象收到相同的消息时产生不同的动作。即调用同一个函数名,可以根据需要,实现不同的功能。 C++ 支持两种多态性:编译时多态性和运行时多态性。本章所叙述的内容是运行时多态性的工作机制和实现方法。 编译时多态性:又称静态多态,是指在编译阶段根据函数名和参数确定应该调用哪一个函数,其过程称为静态关联或早期关联。 运行时多态性:又称为动态多态性,是指在编译阶段根据函数名和参数无法确定应该调用哪一个函数,必须在程序的执行过程中,根据具体的执行情况来动态地确定。这种关联称为动态关联或后期关联。 实现的途径是:继承和虚函数。 只使用编译时多态性机制的程序设计只能称为基于对象(Object Based)的程序设计,使用了运行时多态性机制,才能称为是面向对象(Object Oriented)的程序设计。 6.1 运行多态性 所谓运行多态性是相对与编译多态性而言的。二者的共同作用是实现对象行为的多样性,但在实现方法上和对程序运行控制的作用上有着很大的不同。 1 编译多态性的局限性 由于编译多态性是通过函数重载实现的,因此对象行为的确定(函数的运行绑定)只能由编译器根据程序源代码的安排在编译过程中实现。这样实现的对象行为多样性虽然具有良好的可读性,但在控制程序运行和对象行为多样性方面存在着局限性: ⑴ 对象行为的多样性必须是预先确定可知的,程序运行的控制必须是预先规划固定的,因此只能解决软件所模拟的客观世界中那些可以预先确定和控制的事件的实现。 ⑵ 调用重载函数的不同版本(确定对象行为的多样性)是依据参数(个数和类型)的差别实现的(派生类对基类同名、同参数成员函数的覆盖除外),即发送给不同对象的消息并不完全一致。 从这一点分析,编译多态性所实现的并非完备意义上的多态性,即不同对象接收到同一函数调用(函数名和参数完全一致),表现出不同的行为。 2 运行多态性要实现的目标 运行多态性要实现的目标是在保持编译多态性所能实现的功能的基础上,克服编译多态性的局限性: ⑴ 能根据程序运行中状态的变化,动态确定接收函数调用的对象和对象行为的多样性,使得软件能够实现所模拟的客观世界中那些无法预先确定事件的发生和完成。 ⑵ 完全相同的函数调用(函数名和参数完全一致)能够触发(调用)不同类对象的特定行为,从而实现完备意义的多态性,使得复杂的对象行为控制变得更加简单、统一。 3 运行多态性的实现机制 使程序具有运行多态性的关键是能否在程序运行期间,根据程序的运行状态,动态地修改程序的运行控制指针。 C++(包括C)的编程要素— — 指针变量为动态多态性提供了基本实现机制,即程序能够在运行期间通过修改指针变量的当前值,动态地确定程序的当前操作和操作所施加的数据(对象)。指针变量分为两种: ⑴ 数据指针变量 用于动态确定操作数据,即通过指针而不是使用数据变量名访问数据变量。其定义格式为: 数据类型*指针变量名; 例如:double *pt; 数据指针变量的值是数据空间的首地址,赋值合法性依据是首地址所指示数据的类型。 例如: double d; int i; pt = d; // 合法 pt = i; // 非法 ⑵ 函数指针变量 用于动态确定操作,即通过指针而不是使用函数名实现函数调用。其定义格式为: 返回数据类型(*指针变量名)(参数据类型, … ); 例如:int (*fun)(int, int); 函数指针变量的值是函数的调用地址,赋值合法性依据是调用地址所指示的函数类型(函数的返回类型,参数个数、类型和顺序)。 例如: int max(int, int); void count(double); fun = max; // 合法或fun =max; fun = count; // 非法 6.2 虚函数 在面向对象程序设计中操作和操作所施加的数据是绑定和封装在对象中的。因此,实现动态多态性是在程序运行期间,根据运行状态,动态改变接收同一函数调用的对象,由对象的行为确定操作和操作所施加的数据,从而实现动态地修改程序的运行控制指针。 响应同一函数要求被调用的对象成员函数原型(函数名,返回类型,参数个数、类型和顺序)一致,显然这是函数重载所不能支持的。函数指针虽然能够支持动态多态性,但在面向对象程序设计中直接使用函数指针既烦琐又违背面向对象的设计原则。因此必须引入新的编程机制— — 虚函数。 6.2.1 对象指针 通过指针变量动态确定接收同一函数的对象是实现动态多态

文档评论(0)

189****6140 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档