版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、多态篇一、 概述普通虚函数、虚析构函数、RTTI、异常处理、隐藏-覆盖、早绑定晚绑定、虚函数表二、 虚函数1、 多态2、 静态多态VS动态多态l 静态多态(早绑定):其中calArea是互为重载的两个函数,当我们实例化Rect对象之后,可以分别调用这两个函数,在调用之前就知道分别调用哪个函数了。这种情况叫做早绑定。l 动态多态(晚绑定):对不同的对象下达相同的指令,却做不同的操作。动态多态以封装和继承为基础。 以上打印出的都是父类的面积,这不是我们想要的。所以接下来我们要进行更改,引入虚函数:virtual。将要实现多态的成员函数前面加上virtual,更改代码如下: 3、 经典总结1、只有类
2、的成员函数才能声明为虚函数。2、静态成员函数不能使虚函数,因为它不受限于某个对象。3、内联函数不能使虚函数。4、构造函数不能是虚函数。5、析构函数可以是虚函数。静态多态(早绑定)程序在运行之前,在编译阶段,已经决定到底要使用哪个函数了很早已经将函数编译进去了动态多态(晚绑定):对不同的对象下达相同的指令,却做着不同的操作,必须以继承和封装为基础,至少为两个类一个父类两个派生类,父类中的成员函数类型写成virtual两个派生类中要实现虚函数的最好也加上virtual4、 存在的问题虚析构函数:virtual-析构函数(1) 虚析构函数:目的就是解决用父类的指针调用子类对象时产生的一些内存泄漏问题
3、,delete 指针,指针的类型是什么的,系统就会释放相应内存的空间。所以在父类的析构函数前加上“virtual”关键字,则在释放内存时,会同时释放掉子类对象的内存。(2) 虚不是所有函数都能“虚的”:内联函数不能是虚函数,静态函数不能是虚函数,构造函数不能是虚函数,不是类的成员函数不能是虚函数,即普通函数不能是虚函数5、 虚函数函数指针:存放函数的首地址。虚函数表:实例化类对象时,对象中会有虚函数表指针(四个内存单元),指向其虚函数表。类实例化出的所有对象,其虚函数表指针均指向相同的虚函数表。若在子类中定义了与父类中同名的虚函数,子类的虚函数表中该虚函数对应的虚函数指针会覆盖父类对应的虚函数
4、指针。 隐藏:父类与子类出现了同名函数称为函数的隐藏覆盖:如果我们没有在子类当中定义同名的虚函数,那么在子类虚函数表当中,就会写上父类的虚函数的函数入口地址,如果我们在子类当中也定义了同名的虚函数,那么在子类的虚函数表当中把原来的父类的虚函数的函数地址覆盖,覆盖成子类的虚函数的函数地址。6、 虚析构函数执行完子类的析构函数就会执行父类的析构函数7、对象的大小:在类实例化的对象当中,数据成员所占据的内存大小(没有成员函数)对象的地址:通过一个类,实例化了一个对象,对象在内存中占有一定的内存单元,内存单元的第一个单元的地址就是对象的首地址对象成员的地址:用类实例化一个对象之后,对象当中可能有一个或
5、者多个数据成员,每一个数据成员所占据的地址。对象的每个数据成员,因为类型不同,占据的内存大小也有不同,地址也不同。一个数据成员都没有,C+用一个内存单元表明对象的存在。虚函数表指针:具有虚函数的情况下,实例化对象时,对象的第一块内存中存储的是一个指针,为虚函数表指针,占据大小为4.sizeof(对象名):是对象的大小Int *p=(int *)&shapeCoutpendl;/把shape这个对象的地址打印出来了8、有虚函数时,对象中首先存虚函数表指针,再存数据成员地址,没有虚函数时,首先存的是数据成员的地址。有虚函数时,先使用指针 p 指向对象,访问的虚函数表指针,(*p)取得的是虚函数表地
6、址,再使 p+ 就指向了数据成员,(*p)就能取得数据成员的值。虚函数表指针在对象中所占据的内存位置是前四个,后面才是成员变量的指针9、例子定义一个动物(animal)类,要求含有虚函数eat和move,并定义构造函数和虚析构函数定义一个狗(Dog)类,要求共有继承动物类,定义构造函数和虚析构函数,并实现自己的eat和move函数使用父类对象实例化子类,调用子类成员函数三、 纯虚函数和抽象类1、虚函数:子类继承父类的多态所需要的一个条件;虚函数表:使用virtual关键字修饰会自动产生的一个指针列表;纯虚函数:虚函数中没有函数体,并且将其值直接赋0,的函数称为纯虚函数;抽象类:含有纯虚函数的类
7、;抽象类无法实例化对象;抽象类的子类有可能也是抽象类;2、抽象类:包含纯虚函数的类,无法实例化对象。其子类也可能是抽象类。在子类中将所有纯虚函数均实现后才能实例化对象。为避免头文件重复,可在.h文件里加入#ifndef XXXX_H#define XXXX_H.#endif3、例子定义一个动物(animal)类,要求含有虚函数eat和纯虚函数move以及数据成员m_strName,并定义构造函数和虚析构函数定义一个狗(Dog)类,要求公有继承动物类,定义构造函数和虚析构函数,并实现自己的eat和move函数通过动物类实例化狗类,调用狗类当中的成员函数4、接口类仅含有纯虚函数的类称为接口类。接口
8、类:没有任何的数据成员,只有成员函数,而且成员函数都是纯虚函数。接口类更多的表达一种能力或协议。5、例子 接口类没有数据成员、成员函数,也没有构造函数、析构函数,所以不需要.cpp文件可以使用接口类指针指向其子类对象,并调用子类对象中实现的接口类中纯虚函数。一个类可以继承一个接口类,也可以继承多个接口类。一个类可以继承接口类的同时也继承非接口类。接口类中仅有纯虚函数,不能含有其它函数,也不可以含有数据成员。7、 例子2定义一个能够射击(CanShut)类,要求含有纯虚函数aim和reload定义一个枪(Gun)类,继承CanShut类,并实现函数aim和reload。定义函数Hunting(C
9、anShut *s),调用s指向对象的函数。在函数中传入Gun的对象,查看结果四:RTTI(运行时类型识别)1、 继承关系不是RTTI的充分条件,只是必要条件,所以存在继承关系的类不一定可以用RTTI技术;RTTI的含义是运行时类型识别;RTTI技术可以通过父类指针识别其所指向对象的真实数据类型;2、巩固练习定义一个能够移动(Movable)类,要求含有纯虚函数move定义一个公交车(Bus)类,继承Movable类,并实现函数move,定义函数carry定义一个坦克(Tank)类,继承Movable类,并实现函数move,定义函数shot。定义函数doSomething(Movable *obj),根据s指向对象的类型调用相应的函数。实例化公交车类和坦克类,将对象传入到doSomething函数中,调用相应函数 四、 异常处理1、 异常:程序运行期间出现的错误2、 异常处理:对有可能发生异常的地方做出预先性的安排3、 基本思想:主逻辑与异常处理分离 常见的异常:数组下标越界、除数为0、内存不足(内存泄漏造成的)4、多态和异常处理的关系:在C+中异常处理通常使用try.catch.语法结构。一个try语句可以对应一个或多个c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年机场口岸离境退税验核点布局与海关核验流程
- 2026年集成电路测试方法与可测性设计
- 2026年产业转移与产业升级“齐头并进”:从产能平移向价值链协同转型路径
- 2026届甘肃省定西市安定区初三第三次诊断性考试生物试题含解析
- 2026年广东省佛山市南海中学初三第三次调研化学试题试卷含解析
- 2026年江苏省徐州市云龙区重点中学中考模拟最后十套:化学试题(七)考前提分仿真卷含解析
- 2026届内蒙古巴彦淖尔市临河区八校联盟初三第二次联合调研考试化学试题含解析
- 湖南长沙长郡教肓集团2026年初三生物试题中考冲刺七含解析
- 浙江省吴兴区七校联考2026年初三下学期模拟(五)生物试题含解析
- 福建省永定二中等三校2025-2026学年初三质量检查生物试题含解析
- 百灵达调音台PMP6000用户手册
- 2025年4月自考03346项目管理试题
- 重症肝炎护理病例讨论
- 有色金属冶炼技术专业教学标准(中等职业教育)2025修订
- 碳一新能源集团有限责任公司年产20万吨锂电池材料项目环境影响报告书
- 中小学人工智能通识教育指南(2025年版)
- 2025年高考政治:选必3 《逻辑与思维》思维特征和逻辑规则分类归纳
- 人教版(部编版)六年级语文下册全册教案集体备课表格式
- 小学劳技室课外实践活动计划
- 7.2做人文精神的弘扬者 课件 -2024-2025学年统编版道德与法治七年级下册
- 2025新课标《义务教育数学课程标准(2022年版)》测试题(附含答案)
评论
0/150
提交评论