14-虚函数与多态性.ppt

  1. 1、本文档共18页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
14-虚函数与多态性

第14章 虚函数与多态性 14.1 静态联编和动态联编的概念 14.2 虚函数 14.3 虚析构函数 14.4 纯虚函数和抽象类 14.5 多态性 14.1 静态联编和动态联编的概念 14.1.1 联编的概念 联编又称为关联或绑定,是描述编译器决定在程序运行时,一个函数调用应执行哪段代码的一个术语,它把一个标识符与一个存储地址联系起来。 C++程序的运行要经过编辑、编译、连接、执行等步骤,下图表示的是一个自定义函数disp()的调用过程。 14.1.2 C++的联编有两类 (1)静态联编:在程序编译时系统就能决定调用哪一个函数,即在程序运行之前完成,也称为早期联编。 函数重载和运算符重载就是属于静态联编,尽管它们的函数名或运算符相同,但是可以通过函数的参数个数、参数类型、参数次序的不同来区分函数。 (2)动态联编:在程序编译时系统还不能确定调用哪一个函数,只有在程序运行时才能确定调用的具体函数,又称为晚期联编。 14.2 虚函数 14.2.1 虚函数的声明 虚函数的声明格式很简单,只要在基类成员函数的前面加上关键字virtual即可,具体如下: virtual 函数返回类型 函数名([形参表]) { 函数体 } 说明: ① 只有类的成员函数才能声明为虚函数,普通函数不存在继承关系,不能声明为虚函数。 ② virtual关键字出现在虚函数的声明处,在虚函数的类外定义时不加virtual。 ③ 静态成员函数不能声明为虚函数。 ④ 内联函数不能声明为虚函数。 ⑤ 构造函数也不能声明为虚函数,因为它是在对象产生之前运行的函数。 ⑥ 析构函数可以是虚函数而且通常声明为虚函数。 14.2.2 虚函数的功能 (1)一个基类可以派生多个子类,而这些子类又可以派生很多自己的子类,这样“子子孙孙”无穷无尽,若用派生类来调用虚函数,必然涉及不同的类名称,这样不具有“通用性”。 (2)如果采用对象.虚函数()方式调用,只能得到一个个具体类的结果,不具备“跨类”功能。 (3)当将基类中“感兴趣”的一些成员函数声明为虚函数后,派生类自然继承了这些成员函数,它们与基类的虚函数在名称、参数、返回类型上完全相同,由于虚特性有继承性,不管这些派生类成员函数声明时有无关键字virtual,它们都是虚函数。 (4)虚函数的强大功能要通过虚函数表(常被称为vtable)来实现 对比虚函数、实函数功能的不同点: 实函数:以一个基类指针或基类引用指向一个派生类对象,那么通过该指针或引用只能访问基类的成员函数。 虚函数正是与实函数反其道而行之设计的,具体内容为: 虚函数:定义了虚函数后,以一个基类指针或基类引用指向一个派生类对象,那么通过该指针或引用能够访问派生类的成员函数。 14.2.3 虚函数的应用 应用程序框架(Application Framework),简单地说,就是一个完整的程序模型,具备了标准应用软件所需的一切基本功能,例如:文件读写、打印预览、数据交换、……,及这些功能的使用接口(菜单、对话框、工具栏、状态栏等)。从编程角度来看,应用程序框架是由一整组合作无间的“类”结构组成的大模型,这些类相互独立、又相互作用,形成一个统一的整体。 使用应用程序框架所带来的革命性变化是:程序模型已经存在(在VC++中可以通过MFC AppZiward来创建),程序员只要依个人需求加料就行:在派生类中改写虚函数,或在派生类中加上新的成员函数,大大减低了Windows编程的难度,使得编程技术走向大众化,在这其中虚函数的作用功不可没。 14.2.4 虚函数的使用步骤 要使用虚函数,一般需要经过以下步骤: (1)在基类中,将自己“感兴趣”的函数声明为虚函数,并进行定义。 (2)由于虚函数的继承性,在派生类与基类虚函数同名、且参数、返回类型完全一样的函数自动成为虚函数,再根据实际需要修改派生类虚函数的内容。 (3)将基类或派生类对象地址赋给基类指针,或者用基类或派生类对象初始化基类引用。 (4)用基类指针或引用调用虚函数,这样,系统会在运行时根据所指向对象的不同自动调用基类或派生类的虚函数,从而实现运行时的多态性。 14.3 虚析构函数 图14-8 示例 Person、Student类都有自己的char * 型数据成员,它们通过构造函数中的new运算符在堆中申请存储空间,在析构函数中用delete运算符归还存储空间。我们还知道,当用new创建对象时,系统会自动调用该类的构造函数,并返回对象地址;用delete删除对象指针时,会自动调用析构函数。并且,派生类中构造函数的调用顺序是:先基类,再子对象,最后才是派生类自己;析构函数的调用顺序正好相反,即:先派生类,再子对象,最后是基类。 解决这一问题的方法是引进虚析构函数,将基类的析构函数声明为虚函数。

文档评论(0)

asd522513656 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档