(中职)编程语言基础------C++模块9教学课件.ppt

上传人:春哥&#****71; 文档编号:90587121 上传时间:2023-05-16 格式:PPT 页数:51 大小:907KB
返回 下载 相关 举报
(中职)编程语言基础------C++模块9教学课件.ppt_第1页
第1页 / 共51页
(中职)编程语言基础------C++模块9教学课件.ppt_第2页
第2页 / 共51页
点击查看更多>>
资源描述

《(中职)编程语言基础------C++模块9教学课件.ppt》由会员分享,可在线阅读,更多相关《(中职)编程语言基础------C++模块9教学课件.ppt(51页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Y CF正版可修改PPT(中职)编程语言基础-C+模块9 教学课件模块9多态与虚函数 任务1多态概述 任务2静态联编与动态联编 任务3虚函数返回任务1多态概述 9.1.1 多态的概念 多态就是通过类的继承,使得同一个函数可以根据调用它的对象的类 多态就是通过类的继承,使得同一个函数可以根据调用它的对象的类型不同作出不同的响应。它与继承和重载共同构成了面向对象的三大 型不同作出不同的响应。它与继承和重载共同构成了面向对象的三大编程特性。编程特性。多态是通过虚函数来实现的,虚函数的使用本质就是将派生类类型 多态是通过虚函数来实现的,虚函数的使用本质就是将派生类类型的指针赋给基类类型的指针,虚函数被

2、调用时会动态的判断调用对象 的指针赋给基类类型的指针,虚函数被调用时会动态的判断调用对象的类型,从而给出相应的响应。的类型,从而给出相应的响应。9.1.2多态的应用 下面通过一个例子来说明关于多态的应用。下面通过一个例子来说明关于多态的应用。下一页 返回任务1多态概述【例 例9 9 一 一1 1】设计车辆类 设计车辆类Vehicle Vehicle,提供成员函数,提供成员函数drive drive 表示开车,定义 表示开车,定义drive drive 为纯虚函数 为纯虚函数;派生轿车 派生轿车Car Car 类,提供成员函数 类,提供成员函数drive drive 表示开轿车 表示开轿车;派

3、派生卡车 生卡车Truck Truck 类,提供成员函数 类,提供成员函数drive drive 表示开卡车 表示开卡车;Car;Car 类和 类和Truck Truck 类都 类都继承 继承Vehicle Vehicle 类。类。Vehicle Vehicle 类提供一个纯虚函数 类提供一个纯虚函数drive:drive:表示开车。表示开车。定义 定义Vehicle Vehicle 类,成员函数 类,成员函数drive()drive()为纯虚函数。为纯虚函数。上一页 下一页 返回任务1多态概述上一页 下一页 返回任务1多态概述上一页 下一页 返回任务1多态概述 实例化一个 实例化一个Car

4、Car 类的对象和一个 类的对象和一个Truck Truck 类的对象,先各自调用各自的 类的对象,先各自调用各自的drive drive()()函数,然后将 函数,然后将Car Car 类和 类和Truck Truck 类对象的指针分别赋给一个指向 类对象的指针分别赋给一个指向Vehicle Vehicle类的指针,再次调用 类的指针,再次调用driver()driver()函数,比较结果。函数,比较结果。上一页 下一页 返回任务1多态概述上一页 下一页 返回任务1多态概述 运行结果为 运行结果为:启动轿车 启动轿车!启动卡车 启动卡车!-启动轿车 启动轿车!启动卡车 启动卡车!观察函数 观

5、察函数dirver dirver,就会发现它并没有对传递来的参数进行判断,而是,就会发现它并没有对传递来的参数进行判断,而是直接调用成员函数 直接调用成员函数drive drive,至于是哪个类的成员函数,则是在执行程序,至于是哪个类的成员函数,则是在执行程序的时候确定的。下一次如果又添加了继承 的时候确定的。下一次如果又添加了继承VelllC;le VelllC;le 类的新的子类,函 类的新的子类,函数 数drive:drive:一也不需要更改,只要新的继承子类重写了 一也不需要更改,只要新的继承子类重写了drive drive 函数,函数,drive:drive:就可以调用到它。就可以调

6、用到它。上一页 返回任务2静态联编与动态联编 在 在C+C+中,多态性主要是通过函数重载实现的。重载函数是指程序中 中,多态性主要是通过函数重载实现的。重载函数是指程序中对同名函数进行调用时,编译器会根据函数参数的类型和个数,决定 对同名函数进行调用时,编译器会根据函数参数的类型和个数,决定该调用哪一段函数代码来处理这个函数调用。这种把函数调用与适当 该调用哪一段函数代码来处理这个函数调用。这种把函数调用与适当的函数代码相对应的动作,叫做联编 的函数代码相对应的动作,叫做联编(binding)(binding)联编分为静态联编和动态联编。在编译阶段决定执行哪个同名的被 联编分为静态联编和动态联

7、编。在编译阶段决定执行哪个同名的被调用函数,这称为静态联编。而在编译阶段不能决定执行哪个同名的 调用函数,这称为静态联编。而在编译阶段不能决定执行哪个同名的被调用函数,只在执行阶段才能依据要处理的对象类型来决定执行哪 被调用函数,只在执行阶段才能依据要处理的对象类型来决定执行哪个类的成员函数,这叫动态联编。个类的成员函数,这叫动态联编。下一页 返回任务2静态联编与动态联编 多态性一也分为静态和动态两种。静态多态性是指定义在一个类或一 多态性一也分为静态和动态两种。静态多态性是指定义在一个类或一个函数中的同名函数,它们可根据参数表 个函数中的同名函数,它们可根据参数表(类型及个数 类型及个数)区

8、别,并通过 区别,并通过静态联编实现,例如在一个类中定义的不同参数的构造函数以及运算 静态联编实现,例如在一个类中定义的不同参数的构造函数以及运算符重载等,这些内容在前面都有介绍。动态多态性是指定义在一个类 符重载等,这些内容在前面都有介绍。动态多态性是指定义在一个类层次的不同类中的重载函数,它们一般具有相同的参数表,因而要根 层次的不同类中的重载函数,它们一般具有相同的参数表,因而要根据指针指向的对象所在类来区别,它通过动态联编实现。据指针指向的对象所在类来区别,它通过动态联编实现。为了进一步讲述静态联编和动态联编的区别,我们通过一个例子说 为了进一步讲述静态联编和动态联编的区别,我们通过一

9、个例子说明。明。上一页 下一页 返回任务2静态联编与动态联编【例 例9-2 9-2】以下程序用于计算并显示大学生和研究生的学费。以下程序用于计算并显示大学生和研究生的学费。上一页 下一页 返回任务2静态联编与动态联编上一页 下一页 返回任务2静态联编与动态联编上一页 下一页 返回任务2静态联编与动态联编上一页 下一页 返回任务2静态联编与动态联编上一页 下一页 返回任务2静态联编与动态联编上一页 下一页 返回任务2静态联编与动态联编上一页 下一页 返回任务2静态联编与动态联编 本例设计了一个 本例设计了一个student student 类,其中的 类,其中的calfee()calfee()函

10、数用于输人一个大学生的 函数用于输人一个大学生的学号和姓名并计算学费,学号和姓名并计算学费,disp()disp()用于显示大学生的学费。用于显示大学生的学费。graduate graduate 类是 类是从 从student student 类派生的,其中的 类派生的,其中的calfee()calfee()函数用于输人一个研究生的学号和 函数用于输人一个研究生的学号和姓名并计算学费,姓名并计算学费,disp()disp()用于显示研究生的学费。在 用于显示研究生的学费。在main()main()函数中,定 函数中,定义了一个 义了一个student student 对象 对象s1 s1 和一

11、个 和一个graduate graduate 对象 对象s2 s2。当调用。当调用fn(s1)fn(s1)函数时,函数时,希望输出大学生 希望输出大学生s1 s1 的学费 的学费;调用 调用fn(s2)fn(s2)函数时,希望输出研究生 函数时,希望输出研究生s2 s2 的学 的学费。本程序的一次 费。本程序的一次 执行结果如下 执行结果如下:大学生收费 大学生收费 学号 学号:1:1上一页 下一页 返回任务2静态联编与动态联编 娃名 娃名:下艳 下艳 学费 学费:4800:4800 住宿费 住宿费:1100:1100 书报费 书报费:400:400 其他 其他:200:200 点费用 点费用

12、:(i500:(i500 研究生收费 研究生收费 学县 学县:120:120上一页 下一页 返回任务2静态联编与动态联编 姓名 姓名:张军 张军 学费 学费:4800:4800 住宿费 住宿费:1100:1100 书报费 书报费:400:400 其他 其他:200:200 总费用 总费用:6500:6500上一页 下一页 返回任务2静态联编与动态联编 我们看到,执行 我们看到,执行fn(s1)fn(s1)是正确的,而执行 是正确的,而执行fn(s2)fn(s2)错误,这里仍然输出一 错误,这里仍然输出一个大学生的学费。为什么出现这种情况呢 个大学生的学费。为什么出现这种情况呢?这是因为函数 这

13、是因为函数fn(fn(student&x)student&x)在编译时就确定其对象为 在编译时就确定其对象为student student,所以调用的,所以调用的x.calfee()x.calfee()和 和x.disp x.disp()()均为 均为student student 类的成员函数。而我们希望在执行 类的成员函数。而我们希望在执行fn(s)fn(s)时根据 时根据s s 对象来 对象来确定调用的是 确定调用的是student student 类的成员函数还是 类的成员函数还是graduate graduate 类的成员函数。这里 类的成员函数。这里采用的是静态联编。采用的是静态联

14、编。解决这一问题是采用动态联编,即在执行 解决这一问题是采用动态联编,即在执行fn(s)fn(s)时根据 时根据s s 对象来自动 对象来自动确定调用相应的成员函数,而不是在编译时就确定哪个重载函数被调 确定调用相应的成员函数,而不是在编译时就确定哪个重载函数被调用。这种在运行时能依据其类型确认调用哪个函数的能力称为多态性,用。这种在运行时能依据其类型确认调用哪个函数的能力称为多态性,一也就是动态联编。一也就是动态联编。C+C+使用虚函数来指定哪些函数需用动态联编的方式处理,其他非 使用虚函数来指定哪些函数需用动态联编的方式处理,其他非虚函数在编译连接阶段采用静态联编方式,以节省执行阶段的时间

15、。虚函数在编译连接阶段采用静态联编方式,以节省执行阶段的时间。上一页 返回任务3虚函数 虚函数是动态联编的基础。虚函数是成员函数,而且是非静态的成员 虚函数是动态联编的基础。虚函数是成员函数,而且是非静态的成员函数。如果某类中的一个成员函数被说明为虚函数,这就意味着该成 函数。如果某类中的一个成员函数被说明为虚函数,这就意味着该成员函数在派生类中可能有不同的实现。员函数在派生类中可能有不同的实现。9.3.1 虚函数的定义与应用 在引人虚函数的概念之前,要先回顾一下 在引人虚函数的概念之前,要先回顾一下switch switch 语句。语句。switch switch 语句可 语句可以根据每一种对象的类型选择对该对象进行相应的操作,假设要求一 以根据每一种对象的类型选择对该对象进行相应的操作,假设要求一个图形的面积,对于不同的图形有不同的求面积的方法,利用 个图形的面积,对于不同的图形有不同的求面积的方法,利用switch switch语句可以这样来实现 语句可以这样来实现:下一页 返回

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁