13多态性讲解_精品.pptxVIP

  1. 1、本文档共21页,可阅读全部内容。
  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文档。上传文档
查看更多
;1、多态性的概念;? 派生一个类的原因并非总是为了继承或添加新成员,有时是为了重 新定义基类的成员,使基类成员“获得新生”。 ? 面向对象程序设计的真正力量不仅仅是继承,而是允许派生类对象 像基类对象一样处理,其核心机制就是多态和动态联编。;? 多态是指同样的消息被不同类型的对象接收时导致不同的行为。所 谓消息是指对类成员函数的调用,不同的行为是指不同的实现,也 就是调用了不同的函数。 ? 从广义上说,多态性是指一段程序能够处理多种类型对象的能力。 ? 在C++中,这种多态性可以通过重载多态(函数和运算符重载)、 强制多态(类型强制转换)、类型参数化多态(模板)、包含多态 (继承及虚函数)四种形式来实现。;? (1)重载多态 ? 重载是多态性的最简单形式,分为函数重载和运算符重载。 ? 重定义已有的函数称为函数重载。在C++中既允许重载一般函数, 也允许重载类的成员函数。如对构造函数进行重载定义,可使程序 有几种不同的途径对类对象进行初始化。 ? C++允许为类重定义已有运算符的语义,使系统预定义的运算符可 操作于类对象。如流插入()运算符和流提取()运算符 (原先语义是位移运算)。;? (2)强制多态 ? 强制多态也称类型转换。 ? 如C++定义了基本数据类型之间的转换规则,即: char→short→int→unsigned→long→unsigned long→float→double→long double。 ? 同时,可以在表达式中使用3种强制类型转换表达式: ①static_castT(E);②T(E);③(T)E,其中E代表运算表达式,T代 表一个类型表达式。上述任意一种都可改变编译器所使用的规则, 以便按自己的意愿进行所需的类型强制。 ? 但是强制多态使类型检查复杂化,尤其在允许重载的情况下,导致 无法消解的二义性。;? (3)类型参数化多态 ? 参数化多态即:将类型作为函数或类的参数,避免了为各种不同的 数据类型编写不同的函数或类,减轻了设计者负担,提高了程序设 计的灵活性。 ? 模板是C++实现参数化多态性的工具,分为函数模板和类模板。类 模板中的成员函数均为函数模板,因此函数模板是为类模板服务的。;? (4)包含多态 ? C++中采用虚函数实现包含多态。虚函数为C++提供了更为灵活的 多态机制,这种多态性在程序运行时才能确定,因此虚函数是多态 性的精华,至少含有一个虚函数的类称为多态类。包含多态在面向 对象程序设计中使用十分频繁。 ? 派生类继承基类的所有操作,或者说,基类的操作能被用于操作派 生类的对象。当基类的操作不能适应派生类时,派生类就需要重载 基类的操作。;? 联编(binding)又称绑定,就是将模块或者函数合并在一起生成 可执行代码的处理过程,同时对每个模块或者函数分配内存地址, 并且对外部访问也分配正确的内存地址。 ? 在编译阶段就将函数实现和函数调用绑定起来称为静态联编 (static binding)。静态联编在编译阶段就必须了解所有的函数或 模块执行所需要的信息,它对函数的选择是基于指向对象的指针 (或者引用)的类型。C语言中,所有的联编都是静态联编,C++ 中一般情况下联编也是静态联编。;【例13.1】静态联编举例。;;? 在程序运行的时候才进行函数实现和函数调用的绑定称为动态联编 (dynamic binding) 。 ? 如果在编译“Point *pc=c”时,只根据兼容性规则检查它的合理 性,即检查它是否符合派生类对象的地址可以赋给基类的指针的条 件。至于“pc-area()”调用哪个函数,等到程序运行到这里再决定。 ? 如果希望“pc-area()”调用Circle::area() ,也就是使类Point的指针 pc指向派生类函数area的地址,则需要将Point类的area函数设置成 虚函数。;? 虚函数的定义形式为:;【例13.2】动态联编举例。;;? 当编译器编译含有虚函数的类时,将为它建立一个虚函数表 VTABLE(virtual table),它相当于一个指针数组,存放每个虚函 数的入口地址。编译器为该类增加一个额外的数据成员,这个数据 成员是一个指向虚函数表的指针,通常称为vptr。 ? Point类只有一个虚函数area,所以虚函数表里只有一项。如下图 (a)是Point对象UML示意。 ? 如果派生类Circle没有重写这个虚函数area,则派生类的虚函数表 里的元素所指向的地址就是基类Point的虚函数area的地址。如果派 生类Circle重写这个虚函数area,这时编译器将派生类虚函数表里的 vptr指向Circle::area(),即指向派生类area虚函数的地址。如图(b);;? 当调用虚函数时,先通过vptr找到虚函数表,然后再找出虚函数的

文档评论(0)

有谱教育资源分享 + 关注
实名认证
文档贡献者

热爱生活,分享教育专业文档! 所有资料均来源于互联网公开下载资源,如有侵权,请联系管理员及时删除。

1亿VIP精品文档

相关文档