11 多态-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文档。上传文档
查看更多
11 多态-1

引用和指针 当派生类的成员函数重新定义基类的成员函数时,派生类仍可以通过基类名和二元作用域分辨运算符(::)来访问基类的成员函数。 声明数据成员为private,同时提供对这些数据进行操作和有效性检验的非private成员函数,是好的软件工程实践经验。慎用protected. 实例化派生类的派生类构造函数,首先调用基类的构造函数 (显式地或隐式地),从而(在派生类数据成员初始化之前)初始化派生类对象中的基类数据成员。 Coffee Break 多态性(polymorphism)的概念 希腊词根 poly:很多;morph:形态 C++程序设计中,多态性是指具有不同功能的函数可以用同一个函数名 在面向对象方法中,向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为。也就是说,每个对象可以用自己的方式去响应共同的消息 函数的重载、运算符重载都是多态现象。 运算符“+”使两个数值相加,就是发送一个消息,调用operator+函数。实际上,整型、单精度、双精度型的加法操作过程是互不相同的,它们以不同的行为和方法来响应同一消息 静态多态性和动态多态性 以前学过的函数重载和运算符重载实现的多态性属于静态多态性,在程序编译时系统就能决定调用的是哪个函数,因此又称编译时的多态性 动态多态性是只有在程序运行过程中才能动态地确定操作所针对的对象,从而调用该对象的函数。动态多态性是通过虚函数实现的 当一个基类被继承为不同的派生类时,各派生类可以使用与基类成员相同的成员函数名,如果在程序运行时用同一个成员函数名调用对象的成员函数,会调用哪个对象的成员呢? CommissionEmployee emp = *(new BasePlusCommissionEmployee(……)); emp.earnings( ); virtual函数的例子 Coffee Break virtual函数与多态性 每个派生类都有自己的draw函数,但是各不相同 将基类的draw函数声明为virtual 用指向基类的指针的数组存放每个派生类对象的地址 此时,利用基类Shape的指针调用函数draw,而让程序在执行时,根据任意给定时刻的基类指针所指向的对象的类型,动态地决定应该调用哪个派生类的draw函数 抽象类和纯virtual函数 定义程序员永远不打算实例化任何对象的类是有用的。这样的类称为抽象类(abstract class) 用来实例化对象的类称为具体类(concrete class) 构造抽象类的目的是:为其他类提供适合的基类 Shape基类具有各种形状所共有的draw功能,但是在基类中尚无法确定该如何draw 到底该如何画,需要在具体的派生类中给出详细的实现 抽象类和纯virtual函数 通过定义指向具体类对象的抽象基类指针,可以方便地实现多态性 通过声明类的一个或多个virtual函数为纯virtual函数,可以使一个类成为抽象类 virtual void draw( ) const = 0; //“初始化值为0”的函数 实例研究:应用多态性的工资发放系统 某公司按周支付雇员的工资。雇员一共有四类: 定薪雇员:不管每周工作多长时间都领取固定的周薪; 钟点雇员:按工作的小时数领取工资,并可以领取超过40小时之外的加班费(时给的150%) 佣金雇员:销售提成 带薪佣金雇员:基本工资 + 销售提成。 在本次工资发放阶段,公司决定奖励带薪佣金雇员,把他们的基本工资提高10%。 使用C++的多态性,多态地执行工资的计算 雇员类层次结构 创建抽象基类:Employee 创建抽象基类:Employee 将earnings声明为纯virtual函数 表明每个具体的派生类必须提供一个适当的实现 程序可以利用基类Employee指针,根据其指向雇员的不同类型来多态地调用earnings 在Employee类成员函数的实现中(.cpp),没有为纯virtual函数earnings提供任何实现代码 Employee类层次结构的多态性接口 创建具体的派生类:SalariedEmployee 创建具体的派生类:HourlyEmployee 创建具体的派生类:CommissionEmployee 创建间接派生的具体类: BasePlusCommissionEmployee 演示多态性的执行过程 给BasePlusCommissionEmployee提工资 前述的例子 编译器在编译时为基类指针和具体类对象做好了一个地址对照表,程序运行时只需查表即可确定该怎么作。计算机“貌似知道”基类指针所指向的对象属于哪个具体类。 其实,单凭基类指针的地址对照表,无法真正知道是哪类对象的 需要让程序真正知道哪个对象是“带薪佣金雇员” 使用d

文档评论(0)

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

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档