面向对象程序设计C++:第5章 多态_第1页
面向对象程序设计C++:第5章 多态_第2页
面向对象程序设计C++:第5章 多态_第3页
面向对象程序设计C++:第5章 多态_第4页
面向对象程序设计C++:第5章 多态_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第5章 多 态面向对象程序设计的基本特征之一:多 态什么是多态?字面意思:多种形态例:铅笔移动,杯子移动,房子移动移动操作(函数)具有多态性C+含义:多态性是针对函数来说的,函数的执行是在运行时才动态 绑定到函数的入口地址。p对象-移动( );其p对象是基类型,运行时侦测实际类型确定调用函数(运行时才知道)! 如果 对象是铅笔: p对象-铅笔:移动( );如果 对象是杯子: p对象-杯子:移动( );其移动( )函数具有多态性,移动( )函数是虚函数。面向对象的多态性不但使程序结构更接近现实世界,且使开发可互操作的组件成为可能. Ex5_1实现的语法规则:例:绘图软件系统中的设计 重画抽象基类

2、虚函数 draw5.1.1 C+多态的前提条件必须存在一个类的继承体系。多态性的函数是体系中类的成员函数,且通过关键字virtual修饰,称为虚函数。虚函数的多态调用是通过基类对象引用或指针。语法:class virtual ;class : public virtual ;/基类的成员函数显式声明为虚函数,派生类相应的成员函数没有显式声明也自动成为虚函数。void xFunc (基类名 *pObj) pObj- virtualFunction( );Ex5_1 比较virtual的作用5.1 运行期绑定、编译期绑定编译期绑定:在编译期就确定了函数调用的入口地址。运行期绑定:在编译期并没有确定

3、了函数调用的入口地址,而是在程序运行时。问题:怎样才能找到所运行的函数入口地址?根据什么?答:系统对各个虚函数建有入口地址表,在运行时根据this指针查找相应的入口地址。面向对象的类库的体系结构class Bpublic:virtual void OnDraw()coutB:m()endl;void Run()if( getMsg()=WM_PAINT)OnDraw();/.;class D : public Bpublic:virtual void OnDraw()coutD:m()vtbl.vm(); p-m();void Func( BC *p) p-vm();/哪个m()? p-m()

4、;/哪个m()?多态性的运行开销比较: 虚表占用的内存,访问虚表.但显然开销大不了多少.bvtblbvtbldstruct Vtbl void (*vm)(); &BC:vm&DC:vm内存映射:5.1.4 构造函数与析构函数构造函数不能是虚函数。析构函数可以是虚函数。基类的析构函数声明为虚函数那么也自动为虚函数(为清晰,最好还是用virtual显式修饰。)5.1.6 静态成员函数,顶层函数不可能是虚函数(因没有this指针)5.3 重载、覆盖、遮蔽各种函数重名的情况:1)顶层函数2)在一个类中3)基类与派生类中4)不同的基类中5)不同的派生类中5.3.1重载函数同名,但具有不同的函数签名。5

5、.3.3 遮蔽派生类中的函数,遮蔽基类的同名非虚函数,即使是不同签名。(即基类派生类间的重载失效.)5.3.2 覆盖(override )派生类中的函数,覆盖基类的相同签名虚函数,动态绑定,多态性。5.2 示例程序:影片管理系统菜单:1.Open2.Add Data1)type (Film/DirectorCut/ForeignFilm)2)info3.Output Data4.Save5.Quit5.4 抽象基类5.4.1 纯虚成员函数class Apublic:virtual int Func(int a) = 0 ;注意:没有实现部分.5.4.2抽象类含有纯虚成员函数的类。抽象类作为基类

6、使用。抽象类不能实例化。例: A a; X抽象基类作用:使用虚成员函数是为了多态性,为了使类体系具有一致的用户接口,但对于顶层的基类,可能是高度抽象,没有实际的代码可写,于是使用虚成员函数,可节省内存,可使各种组件的互操作成为可能。例:微软的组件对象模型COM的基础struct IUnknownvirtual LONG QueryInterface(REFIID iid, void * ppvObject )=0;virtual ULONG AddRef(void)=0;virtual ULONG Release(void)=0; Ex5_45.5 运行期类型识别5.5.3 类型转换1.强制转

7、换 2. static_cast 3. dynamic_cast例:BC *pbc=new DC;DC *pdc= (DC*)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(类

8、型)例:class BC virtual void m();class DC : public 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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论