版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第5章 多 态面向对象程序设计的基本特征之一:多 态上海大学机电工程与自动化学院 雷电什么是多态?字面意思:多种形态例:铅笔移动,杯子移动,房子移动移动操作(函数)具有多态性C+含义:多态性是针对函数来说的,函数的执行是在运行时才动态 绑定到函数的入口地址。p对象-移动( );其p对象是基类型,运行时侦测实际类型确定调用函数(运行时才知道)! 如果 对象是铅笔: p对象-铅笔:移动( );如果 对象是杯子: p对象-杯子:移动( );其移动( )函数具有多态性,移动( )函数是虚函数。面向对象的多态性不但使程序结构更接近现实世界,且使开发可互操作的组件成为可能. Ex5_1实现的语法规则:上海
2、大学机电工程与自动化学院 雷电例:绘图软件系统中的设计 重画抽象基类虚函数 draw上海大学机电工程与自动化学院 雷电5.1.1 C+多态的前提条件必须存在一个类的继承体系。多态性的函数是体系中类的成员函数,且通过关键字virtual修饰,称为虚函数。虚函数的多态调用是通过基类对象引用或指针。上海大学机电工程与自动化学院 雷电语法:class virtual ;class : public virtual ;/基类的成员函数显式声明为虚函数,派生类相应的成员函数没有显式声明也自动成为虚函数。void xFunc (基类名 *pObj) pObj- virtualFunction( );Ex5_
3、1 比较virtual的作用上海大学机电工程与自动化学院 雷电5.1 运行期绑定、编译期绑定编译期绑定:在编译期就确定了函数调用的入口地址。运行期绑定:在编译期并没有确定了函数调用的入口地址,而是在程序运行时。问题:怎样才能找到所运行的函数入口地址?根据什么?答:系统对各个虚函数建有入口地址表,在运行时根据this指针查找相应的入口地址。上海大学机电工程与自动化学院 雷电面向对象的类库的体系结构class Bpublic:virtual void OnDraw()coutB:m()endl;void Run()if( getMsg()=WM_PAINT)OnDraw();/.;class D
4、: public Bpublic:virtual void OnDraw()coutD:m()vtbl.vm(); p-m();void Func( BC *p) p-vm();/哪个m()? p-m();/哪个m()?多态性的运行开销比较: 虚表占用的内存,访问虚表.但显然开销大不了多少.bvtblbvtbldstruct Vtbl void (*vm)(); &BC:vm&DC:vm内存映射:上海大学机电工程与自动化学院 雷电5.1.4 构造函数与析构函数构造函数不能是虚函数。析构函数可以是虚函数。基类的析构函数声明为虚函数那么也自动为虚函数(为清晰,最好还是用virtual显式修饰。)5
5、.1.6 静态成员函数,顶层函数不可能是虚函数(因没有this指针)上海大学机电工程与自动化学院 雷电5.3 重载、覆盖、遮蔽各种函数重名的情况:1)顶层函数2)在一个类中3)基类与派生类中4)不同的基类中5)不同的派生类中上海大学机电工程与自动化学院 雷电5.3.1重载函数同名,但具有不同的函数签名。5.3.3 遮蔽派生类中的函数,遮蔽基类的同名非虚函数,即使是不同签名。(即基类派生类间的重载失效.)5.3.2 覆盖(override )派生类中的函数,覆盖基类的相同签名虚函数,动态绑定,多态性。上海大学机电工程与自动化学院 雷电5.2 示例程序:影片管理系统上海大学机电工程与自动化学院 雷
6、电菜单:1.Open2.Add Data1)type (Film/DirectorCut/ForeignFilm)2)info3.Output Data4.Save5.Quit上海大学机电工程与自动化学院 雷电5.4 抽象基类5.4.1 纯虚成员函数class Apublic:virtual int Func(int a) = 0 ;注意:没有实现部分.5.4.2抽象类含有纯虚成员函数的类。抽象类作为基类使用。抽象类不能实例化。例: A a; X上海大学机电工程与自动化学院 雷电抽象基类作用:使用虚成员函数是为了多态性,为了使类体系具有一致的用户接口,但对于顶层的基类,可能是高度抽象,没有实际
7、的代码可写,于是使用虚成员函数,可节省内存,可使各种组件的互操作成为可能。例:微软的组件对象模型COM的基础struct IUnknownvirtual LONG QueryInterface(REFIID iid, void * ppvObject )=0;virtual ULONG AddRef(void)=0;virtual ULONG Release(void)=0; Ex5_4上海大学机电工程与自动化学院 雷电5.5 运行期类型识别5.5.3 类型转换1.强制转换 2. static_cast 3. dynamic_cast例:BC *pbc=new DC;DC *pdc= (DC*
8、)pbc; /1DC *pdc= static_cast(pbc); /2DC *pdc= dynamic_cast(pbc); /3DC &dc= (DC&)(*pbc); /1DC &dc= static_cast(*pbc); /2DC &dc= dynamic_cast(*pbc); /3区别:若转换不成功, dynamic_cast的结果为NULL(0),且只能用于多态性类型能动态类型识别上海大学机电工程与自动化学院 雷电5.5.4 typeid操作符格式typeid(表达式)=typeid(类型)例:class BC virtual void m();class DC : publ
9、ic BC ; BC *p=new DC; int x=5;typeid( x) = typeid (int ) / truetypeid( p) = typeid (BC *) / truetypeid( p) = typeid (DC *) / false typeid( *p) = typeid (BC) / falsetypeid( *p) = typeid (DC) / true注意:基类必须有虚函数,上面才对。上海大学机电工程与自动化学院 雷电VC+ 6.0 上海大学机电工程与自动化学院 雷电面向对象程序设计方法小结组合: 组合了其它对象class Window Button bn; ;优点:封装性好 , 专注于一项任务. 缺点:系统中的对象可能过多 继承:继承基类,扩展改变基类class Circle : public Point;优点:容易进行新的实现,因为其大多数可继承而来。缺点 :破坏了封装性,当父类的实现更改时,子类也不得不随之更
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【强人工智能刑事责任能力与现行制度之契合分析3700字】
- 2026年大气环境监测工专项题库(附答案与解释)
- 【双波段线阵插件硬件模块电路设计与测试分析案例11000字】
- 2026年集控值班员专项题库(附答案与解释)
- 桐油加工行业税收管理办法
- 客户忠诚度服务标准合同协议2026
- 工业互联网平台运营管理合同2026修订
- 品牌管理2026年品牌用户运营协议
- 监事会信息披露流程协议
- 健身课程合作合同2026年执行
- 2026年新特种设备安全作业管理人员考试题库及答案
- 国开网 形势与政策 2026春大作业答案(内含5个版本)
- 2025-2026学年北师大版小学二年级数学下册教学计划及进度表
- 2025年四川省泸州市江阳区小升初数学试卷(含解析)
- 2025年锂电池行业销售面试题库及答案
- 输煤系统生产管理制度
- 2026年山东省网络安全工程职称(网络安全技术研发与应用)核心备考题库(含典型题、重点题)
- 2025年《财务共享中心》知识考试题库及答案解析
- T/CCEAS 005-2023 建设项目设计概算编审规范
- 四川省内江市2024-2025学年八年级上学期期末考试数学试题
- 美术教学年终总结报告
评论
0/150
提交评论