面向对象程序设计课件.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文档。上传文档
查看更多
第5章多态与抽象类 《面向对象程序设计》 第5章 多态与抽象类 内容提要 5.1 类层次的多态问题 5.2 类型兼容规则(重点) 5.3 多态的概念 5.4 多态的分类 5.5 联编 5.6 虚函数(重点) 5.7 抽象类与纯虚函数(重点) 提出问题 【例5-1】在例4-1程序中存在的两个不足: (1)基类Pay()和Display()的函数体均为空,在实现部分仍要写出函数体,显得冗余。 (2)在主函数中,建立了4个不同类的对象,进行了类似的操作,重复写了4遍类似的语句,程序不够简洁。 分析问题 基类设置成员函数Pay()和Display()的目的是为了统一规定类簇的基本行为,虽有冗余,但也必要。为此,C++提供了纯虚函数来解决此问题。 在主函数中建立了4个不同类的对象,进行了类似的操作,重复写了4遍类似的语句。 应该怎样有效地来处理它们同样的行为呢?我们首先想到的是用循环解决,但调用这些同名函数的对象却不相同。 分析这些对象有一个共同点,那就是来自于同一个基类,而基类与派生类对象有什么关系呢?事实上,它们遵循类型兼容规则。 Employee *emp[4]={m1,t1,s1,sm1}; //声明抽象类指针数组 for(int i=0;i4;i++) { emp[i]-Pay(); //单一指令,实现多态,计算指针指向对象的工资 emp[i]-Display();//单一指令,实现多态,输出指针指向对象的信息 } 5.2类型兼容规则 类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。 通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员。这样,公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。 类型兼容规则中所指替代包括以下情况: (1)派生类的对象可以赋值给基类的对象。 (2)派生类的对象可以初始化基类的引用。 (3)派生类的对象的地址可以赋值给基类的指针变量。 在替代之后,派生类对象就可以作为基类的对象使用,但只能访问从基类继承的成员。 【例5-3】示例类型兼容规则的应用。 教材P261,该程序的运行结果为: Base class Base class Base class Derivel class Derive2 class 根据类型兼容规则,基类指针p可以指向派生类对象obj2、obj3(即派生类对象可以代替基类对象,给基类指针赋值),但编译时,编译器根据p的类型是基类型,自动调用基类的who(),所以结果如上所示。 【思考题5-3】如果基类指针要访问派生类的who(),怎么办? C++提供了多态机制来解决这个问题。 类型兼容规则是C++多态的重要基础。 多态 多态(Polymorphism)是指具有相似功能的不同函数使用同一个名称来实现,从而可以使用相同的调用方式来调用这些具有不同功能的同名函数的特性。 5.4 多态的分类 C++支持的多态可以分为四种类型: 重载多态:函数重载和运算符重载 强制多态:强制类型转换 包含多态:虚函数 参数多态:函数模板和类模板 联编 联编是指把一个标识符名和一个存储地址联系在一起的过程。即函数调用与某个函数在多态的实现过程中,确定调用哪个同名联系的过程,又称绑定。分为: 静态联编 动态联编 静态联编是在编译阶段完成的联编。例5-2、例5-3及以前的函数重载都是采用静态联编方式。 例5-4,教材P265,是静态联编。 动态联编是在运行阶段完成的联编。 在例5-4中,静态联编把基类指针ps指向的对象绑定到基类上,而在运行时进行动态联编将把ps指向的对象绑定到派生类上。 可见,同一个指针,在不同阶段被绑定的类对象将是不同的,进而被关联的类成员函数也是不同的。 如何来确定是用静态联编还是用动态联编呢? C++规定,动态联编通过继承和虚函数来实现。 虚函数是动态联编的基础。下面介绍虚函数。 5.6 虚函数 虚函数就是在基类中被关键字virtual说明、并在一个或多个派生类中被重新定义的成员函数。 声明虚函数的格式如下: virtual 函数值类型 函数名(参数表); 在派生类中重新定义虚函数时,其函数原型包括返回类型、函数名、参数个数与参数类型的顺序,都必须与基类中的原型必须相同。 一个函数一旦被声明为虚函数,则无论声明它的类被继承了多少层,在每一层派生类中该函数都保持虚函数特性。因此,在派生类中重新定义该函数时,可以省略关键字virtual。但是,为了提高程序的可读性,往往不省略。 在程序运行时,不同类的对象调用各自的虚函数,这就是运行时多态。 【例5-5】将例5-4基类的成员函数print()设为虚函数,采用对象指针调用虚函数,进而实现动态联编

文档评论(0)

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

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

1亿VIP精品文档

相关文档