面向对象-8.pdfVIP

  1. 1、本文档共42页,可阅读全部内容。
  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文档。上传文档
查看更多
面向对象-8

第八章:多态性 继承讨论的是类与类的层次关系,多态(polymorphism)则是考虑这种层次关 系以及类自身内部特定成员函数之间的关系问题,是解决功能和行为的再抽象问 题。直观的讲,多态是指类中具有相似功能的不同函数使用同一名称来实现,从 而可以使用相同的调用方式来调用这些具有不同功能的同名函数。 §8.1多态性概述 多态是指同样的消息被不同类型的对象接收时导致完全不同的行为,所谓消 息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同 的函数。 §8.1.1 多态的类型 面向对象的多态性可以严格地分为四类:重载多态、强制多态、包含多态和 参数多态,前面两种统称为专用多态,后面两种称为通用多态。 前面介绍的普通函数及类的成员函数的重载都属于重载多态,本章还将讲述 运算符重载,也属于重载多态。强制多态是通过语义操作把一个变元的类型加以 变化,以符合一个函数或者操作的要求。例如加法运算符在进行浮点数和整型数 相加时,首先进行类型强制转换,把整型数变为浮点数再相加的情况就属于强制 多态。 包含多态是研究类族中定义于不同类中的同名成员函数的多态行为,主要通 过虚函数来实现。参数多态与类模板(类属)相关联,类属是一个可以参数化的 模板,其中包含的操作所涉及的类型必须用类型参数实例化。这样,由类模板实 例化的各类都具有相同的操作,而操作对象的类型却各不相同。 本章学习重点是重载和包含两种多态类型,函数重载在前面函数及类的部分 曾作过详细的讨论本章主要介绍运算符重载,虚函数是学习包含多态的关键内 容。 §8.1.2 多态的实现 多态从实现的角度来讲可以划分为两类,编译时的多态和运行时的多态。前 者是在编译过程中确定了同名操作的具体操作对象,而后者则是在程序运行过程 中才动态地确定操作所针对的具体对象。这种确定操作的具体对象的过程就是联 编(binding),也有的文献称为编联、束定、绑定和聚束。联编是指计算机程 序自身彼此关联的过程,也就是把一个标识符名和一个存储地址联系在一起的过 程;用面向对象的术语讲,就是把一条消息和一个对象的方法相结合的过程。 按照联编进行的阶段的不同,可以分为两种不同的联编方法:静态联编和动 态联编,这两种联编过程分别对应于多态的两种实现方式。 189 联编工作在编译连接阶段完成称为静态联编。因为联编过程是在程序开始执 行之前进行的,因此有时也称为早期联编或前联编。在编译、连接过程中,系统 就可以根据类型匹配等特征确定程序中操作调用与执行该操作代码的关系,即确 定了某一个同名标识到底是调用哪一段程序代码。有些多态类型,其同名操作的 具体对象能够在编译、连接阶段确定,通过静态联编解决,比如重载、强制和参 数多态。 联编工作在程序运行阶段完成称为动态联编,也称为晚期联编或后联编。在 编译、连接过程中无法解决的联编问题,要等到程序开始运行之后再来确定,包 含多态的操作对象的确定就是通过动态联编完成的。 §8.2运算符重载 运算符重载是对已有的运算符赋于多重含义,同一运算符作用于不同类型的 数据导致不同类型的行为。 C++中预定义的运算符的操作对象只能是基本数据类 型,实际上对于用户自定义的类型也可以定义类似的运算操作。赋予运算符以新 的运算功能。 运算符重载的实质就是函数重载。在实现过程中,首先把指定的运算表达式 转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参 的类型来确定需要调用的函数,这个过程是在编译过程中完成的。 §8.2.1 运算符重载的规则和实现 一、运算符重载的规则 运算符使用有三种形式:中缀形式、后缀形式和前缀形式。理解三种形式的 表示方法对准确重载运算符含义非常重要。 中缀形式:a+b 后缀形式:a++ 前缀形式:++a 运算符的优先级、括号、结合性决定了运算符重载的实现: a+b*c operator +(a,operator *(b,c)) //优先级 a+b*!c operator +(a,operator *(b,c.operator !())) //优先级 a*(b+c) operator *(a,operator +(b,c)) //括号

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档