c03-面向对象语法3.ppt_第1页
c03-面向对象语法3.ppt_第2页
c03-面向对象语法3.ppt_第3页
c03-面向对象语法3.ppt_第4页
c03-面向对象语法3.ppt_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、多态性和虚函数,本章须掌握的内容 理解多态的含义及用法 理解虚函数的实现原理 学会运用虚函数和纯虚函数 理解抽象类的用法,多态性的概念,当不同的对象接受到相同的消息名(或者说当不同的对象调用相同名称的成员函数)时,可能引起不同的行为(执行不同的的代码)。这种现象称为多态性(polymorphism)。若语言不支持多态,则不能称为是面向对象语言,只能说是基于对象的。,多态性的分类,静态多态性 静态多态性是指在程序编译后就决定调用的是哪个函数。如函数重载和运算符重载 动态多态性 动态多态性是指程序在运行过程中才能决定调用哪个函数。动态多态性是通过虚函数实现的,虚函数的作用,虚函数是实现动态多态性的

2、途径。当一个类中的函数定义为虚函数时,可以用指向基类的指针指向一个派生类对象,并通过这个指针调用在派生类中重写后的函数。利用这个特性,可以通过一个基类指针操纵许多不同派生类的对象,也就是说每个对象接收的是同样的消息,但却可以调用不同的函数,完成不同的功能。,虚函数的用法,在基类中用virtual声明成员函数为虚函数。 在派生类中重写此函数。 定义一个指向基类的指针变量,使它指向一个派生类对象 通过此指针调用此虚函数 class A public: virtual void f()cout f(); ,静态关联和动态关联,什么是关联(binding) 关联就是在连接阶段(编译之后)将程序中的标识

3、符换成地址。 什么是静态关联(static binding) 静态关联是指在程序连接时可以直接计算出函数的入口地址,并将此地址写到程序的目标代码中 什么是动态关联(dynamic binding) 动态关联是指在程序连接时不能直接计算出函数的入口地址,需通过某个变量间接获得函数地址。,虚函数的实现原理,当一个类或其基类中存在虚函数时,系统会为这个函数创建一个虚函数表(virtual function table,全局数据区)。虚函数表中存放此类中的所有虚函数的入口地址。当初始化此类的对象时,对象中会增加一个成员(vfptr),指向对应类中的虚函数表。初始化基类时, vfptr指向基类对应的虚函

4、数表,初始化派生类成员时,vfptr指向派生类对应的虚函数表。访问对象的虚函数时,会从虚函数表中寻找相应的函数地址作为入口地址。,虚函数的使用要点,对虚函数的访问权限以基类中定义的为准。也就是说只要基类中的虚函数是public,即使派生类中重写的函数为private,仍然可以通过基类指针访问到派生类中的函数 虚函数的空间不会重复存储。也就是说只会在最上一层的基类中保存虚函数地址,下面的派生类中,无论此虚函数被重载多少次,都不会再为它分配空间。 重写虚函数时,函数名、形参个数和类型必须相同,但返回值可以不同。 当基类中的函数定义为虚函数时,无论派生类中的函数是否定义为虚函数,都当作虚函数处理,举

5、例1,class A public: virtual void f()cout f(); ,举例2,class A public: void f()cout f(); ,何时使用虚函数,首先看成员函数所在的类是否会作为基类,然后看成员函数在派生类中是否需要修改,如果需要修改则应声明为虚函数 考虑成员函数在派生类中重载后是否需要通过基类的指针调用,如果需要,一般要声明为虚函数 有时,成员函数在基类中不作任何事情,只是保留一个调用形式,实质工作需在派生类中完成,此时要声明为虚函数,虚函数的使用限制,只有类的成员函数才能声明为虚函数 静态函数不能声明为虚函数 构造函数不能声明为虚函数,虚析构函数,当

6、使用new运算符动态创建一个对象时,将对象地址赋给一个指向基类的指针,此时用delete运算符撤销该对象时,只会调用基类的析构函数,这样可能会带来一个严重的问题派生类中的资源不能被释放 如果将基类的析构函数定义为虚函数,当用delete运算符撤销该对象时,系统会采用动态关联,调用派生类的析构函数,纯虚函数,当虚函数不作任何事情,只是为其派生类提供一个形式,其具体功能由派生类提供,并且要求派生类必须提供,此时可将此虚函数声明为纯虚函数 声明纯虚函数的形式为: virtual 函数类型 函数名(形参表)=0; 或者 virtual 函数类型 函数名(形参表)const=0; 纯虚函数没有函数体,因

7、此不能被执行;后面的=0不代表返回0,而只是一个形式,表明是纯虚函数;纯虚函数的声明后面必须有分号 如果纯虚函数在派生类中没有被定义,则在派生类中仍然是纯虚函数,抽象类,抽象类中至少有一个纯虚函数,也就是说只要类中有一个纯虚函数,那么这个类就是抽象类 抽象类不能直接定义对象,只能作为其他类的基类 不能创建抽象类的对象,但可以创建指向抽象类的指针 如果类中所有成员都是纯虚函数,那么可以把这个类称为纯抽象类。,接口(interface),VC+.NET增加了interface的概念,它相当于一个纯抽象类。 面向接口编程,面向接口编程,1 什么是接口 2 接口和抽象类的区别 3 面向接口编程 4 和面向对象编程的关系,举例,class CShape public: void Draw(CDC* pdc)=0; ; class CRectan

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论