第7章多态性解析.ppt

  1. 1、本文档共27页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第7章 多态性 多态性(Polymorphism)是面向对象程序设计的重要特性之一。多态是指为一个函数名称关联多种含义的能力,它不仅提高了面向对象软件设计的灵活性,而且使得设计和实现具有良好的可重用性和可扩充性的应用软件成为可能。 本章主要介绍动态绑定、虚函数、抽象类等重要的概念和实现方法。 7.1 面向对象编程——多态 7.2 虚函数与动态绑定 7.3 纯虚函数与抽象类 7.4 案例实训 第7章 多态性 7.1 面向对象编程——多态 在面向对象程序设计中,多态性是指同样的消息被不同类型的对象接收时会产生完全不同的行为,即每个对象可以用自己特有的方式响应相同的消息。这里的消息是指对函数的调用,不同的行为是指不同的实现,即执行不同的函数。 从程序实现的角度,多态可分为两类:编译时的多态和运行时的多态。编译时的多态性是通过静态绑定实现的,而运行时的多态性则是在程序运行过程中通过动态绑定实现的。这里的绑定(Binding,又称联编)是指函数调用与执行代码之间关联的过程。 静态绑定(Static Binding)是在程序的编译与连接时就已确定函数调用和执行该调用的函数之间的关联。在生成的可执行文件中,函数调用所关联执行的代码是已确定的,因此静态绑定也称为早绑定(Early Binding)。前面介绍的函数重载(含运算符重载)就属于编译时的多态。 动态绑定(Dynamic Binding)是在程序运行时根据具体情况才能确定函数调用所关联的执行代码,因而也称为晚绑定(Late Binding)。在C++中,动态多态性的实现方法是在同一个类的继承层次结构中通过定义虚函数(Virtual Function)实现。 7.1 面向对象编程——多态 7.1 面向对象编程——多态 在C++中,当通过基类指针(或引用)请求调用虚函数时,C++程序会在运行过程中正确地选择与对象关联的派生类中重定义的虚函数。 设计平面与立体几何形处理程序,类的层次结构如图所示。几何形类为基类,其中定义了求面积和体积的成员函数。在派生类中,根据几何形特征,分别重新定义相应函数以正确地求出相应的面积和体积。 7.1 面向对象编程——多态 在类的继承中,重新定义同名且形参相同的成员函数称为同名覆盖。现假设需要设计一个显示函数,其功能是显示类层次结构中所有类(包含还未定义的派生类)对象的面积和体积等信息,该函数需要能接收类层次结构中的所有类的对象,故函数形参应定义为几何形类的指针(或引用)。由于该函数的形参是基类指针(或引用),从前一章的知识可知,若传递的实参为派生类对象,则函数只能访问几何形类的成员函数而不能访问派生类中的面积和体积函数。 C++的解决方法是将几何形类中的面积和体积函数定义为虚函数,程序在运行时利用多态性能正确地调用与所传递对象的计算面积和体积的成员函数。 类中的成员函数被声明为虚函数后,C++编译器将对虚函数进行特别处理以支持动态绑定。本节在介绍虚函数的基本用法后,着重解析VC++中动态绑定机制的实现方法,旨在从技术层面理解多态性的概念。 7.2 虚函数与动态绑定 7.2.1 虚函数的定义和使用 虚函数的定义方法是用关键字virtual修饰类的成员函数。例如: virtual double area(); 在C++中,不是任何成员函数都能说明为虚函数,虚函数的使用需要注意以下几点: 在派生类中重定义的虚函数要求函数签名和返回值必须与基类虚函数完全一致,而关键字virtual可以省略。在类的层次结构中,成员函数一旦在某个类中被声明为虚函数,那么在该类之后派生出来的新类中它都是虚函数。 虚函数不能是友元函数或静态成员函数。 ? 7.2 虚函数与动态绑定 7.2 虚函数与动态绑定 构造函数不能是虚函数,而析构函数可以是虚函数。 基类的虚函数在派生类中可以不重新定义。若在派生类中没有重新改写基类的虚函数,则调用的仍然是基类的虚函数。 通过类的对象调用虚函数仅属于正常的成员函数调用,调用关系是在编译时确定的,属于静态绑定。动态绑定(动态多态性)仅发生在使用基类指针或基类引用调用虚函数的过程中。 【例7-1】设计动物类及其派生类,并定义虚函数显示每种动物爱吃的食物。 7.2 虚函数与动态绑定 程序说明: Animal基类中定义了eat()虚函数,用于显示动物爱吃的食物,成员函数getName()用于返回动物名称,构造函数用于初始化对象。除Poultry类没有重定义eat()函数外,其余派生类均重新定义了该虚函数。 从运行结果可知,Poultry派生类没有自己的eat()函数,则继承了基类函数,而Monkey、Panda等派生类对象均调

文档评论(0)

挑战不可能 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档