2DUOTAI
多态 面向对象核心 Contents 继承召唤多态 继承机制的几种限制 派生类对象可以赋值给基类,反过来不行 指向基类的指针可以指向派生类,反过来不行 回顾继承的另一个规则--覆盖 目前类继承机制的一个局限 编程: 学校有一个”学生缴费办公室”, 处理全校学生的缴费工作,包括研究生,本科生等 各种学历的学生的缴费处理不同 本科:5000¥/年 研究生:10000¥/1年 为方便处理,把所有的学生放在一起处理:即把本科和研究生对象放在一个数组/向量中 可能吗? 形似or神似 数组或向量不能存放不同类型对象,但继承机制的引入使在概念上使“派生类”是“基类” 同化 当把对象b放入向量v中时,b已经被同化了 可以通过sizeof看到对象所占用的空间 换一种思路 基类的指针可以指向派生类对象 向量中存放基类的指针,但指针指向真实的内容可以是派生类对象 解决前面的问题 编程: 学校有一个”学生缴费办公室”, 处理全校学生的缴费工作,包括研究生,本科生等,各种学历的学生的缴费处理不同 本科:5000¥/年 研究生:10000¥/1年 为方便处理,把所有的学生放在一起处理:即把本科和研究生对象放在一个数组/向量中(存放对象的指针) 问题2:解决类的设计 本科生类和研究生类的设计 type属性:表明学生的类型 研究生类 为了把所有学生放在一个向量中,需要继承关系: 程序运行分析 尽管向量v中存放的是指针,指针指向的不同的类型,但都是调用的基类的 calcTuition函数 因为这里编译器是“静态链接”(即类型检查决定调用函数),在编译阶段已经确定了程序的运行过程 修改程序以反映正确结果 编译器同样根据类型决定调用:此时的v[i]已经被强制转换为GraStu*类型,而根据“覆盖”规则,编译器规定程序执行的是派生类的calcTuition函数 多态的引入 显然,上面的“类型”转换来处理向量中的对象在批量处理中是不现实的 向量中哪些对象是“基类”类型,哪些对象是“派生类”类型,程序员在编程时不一定知道:比如用户从键盘输入来构建对象,然后存放到向量中 适当的修改程序,可以实现“主动”判断,见书例题 不足 我们需要的是一种“自动识别”机制,即:由程序自动判断出对象的“真正类型”,然后执行正确的动作,而不是由程序员判断类型 例程中,v[i]-calcTuition(); 是调用成员函数 我们希望当v[i]指向不同类型时,会自动调用不同对象的calcTuition函数(因为派生类会覆盖基类的同名函数) 前面编程实现的方式是通过手动判断对象类型然后进行“类型转换”,这种方式不利于程序的扩展 学校再增加一个“博士生类”,则fn函数需要改变,如果程序能“自动”识别,就可以实现“抽象”编程,fn函数不需要改变,即“处理流程”不变,增加类,改变“界面”即可。 多态的目标 多态的实现 概念: 一个操作随着所传递或捆绑的对象类型不同能做出不同的反应, 其行为模式称为多态 虚函数 对于基类和派生类相同的函数(函数名和形参列表), 只要标记 “ virtual” ,则函数就是虚函数,虚函数具有多态的特性 简单的多态例子 程序输出: In Base class In Sub class 多态的实现条件-重要 继承 虚函数 一旦基类某个函数声明为virtual函数, 派生类覆盖的函数都成了虚函数,所以,派生类同名函数上的virtual可省 指针或引用 多态仅对指针和引用有意义, 如果是”值传递”, 不存在多态 函数覆盖而不是重载 覆盖意味着完全一样,而重载是参数列表有区别 多态条件1-虚函数 多态条件2-指针或引用 多态条件3-覆盖 虚函数机制--了解 如何“动态联编” 虚函数实际上是如何被编译器处理的呢? 编译器发现一个类中有被声明为virtual的函数,就会为其搞一个虚函数表,也就是VTABLE。VTABLE实际上是一个函数指针的数组, 每个虚函数占用这个数组的一项。 一个类只有一个VTABLE,不管它有多少个实例。 派生类有自己的VTABLE,但是派生类的VTABLE与基类的VTABLE有相同的函数排列顺序,同名的虚函数被放在两个数组的相同位置上。 在创建类实例的时候,编译器还会在每个实例的内存布局中增加一个vptr字段,该字段指向本类的VTABLE。 通过这些手段,编译器在看到一个虚函数调用的时候,就会将这个调用改写 多态的应用 文件data.txt中存放有一些数据,分别是圆的半径和矩形的长和宽,现在读出这些数据,并求面积 文件中的数据如下 c 3 r 4 5 r 6 7 c 5 x 不用“多态”编程也可以解决,如下 “简洁的”解决方案 面向对象的解决方案 把数据抽象独立出来,但处理过程和界面没有分开 进一步划分 类的定义 对程序中所
您可能关注的文档
- 国贸实务第二讲.ppt
- 幻灯片 1_3.ppt
- 论货币.doc
- 第二讲 货币和信用0313.ppt
- The concept of international taxation.ppt
- DEH功能介绍.ppt
- 跨国1.doc
- n(常用单数)航行.doc
- 第二册第二课教案.doc
- MBA大纲词汇(S字母).doc
- (2026春新版)部编版八年级语文下册《第一单元》PPT课件.pptx
- 2018电力监控系统网络安全监测装置技术规范.docx
- 2022电力监控系统安全防护方案审核要点.docx
- 2014电力电缆光伏系统EN 50618欧标.docx
- (2026春新版)人教版二年级数学下册《第三单元 万以内数的认识》教案.docx
- (2026春新版)人教版二年级数学下册《第四单元 万以内的加法和减法》教案.docx
- (2026春新版)人教版二年级数学下册《综合与实践 时间在哪里》教案.docx
- (2026春新版)苏教版二年级数学下册《综合与实践 时间有多长》教案 .pdf
- (2026春新版)部编版三年级语文下册第3单元(教案).docx
- (2026春新版)部编版三年级语文下册第8单元(教案).docx
原创力文档

文档评论(0)