第7章虚函数.pptVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第7章虚函数

第7章 虚函数 本章内容: 7.1 虚函数 7.2 虚析构函数 7.3 抽象类 7.4 友元、绑定 7.5 类的存储空间 7.1 虚函数 虚函数:即用virtual定义的成员函数。Java几乎所有函数都为虚函数。 当基类对象指针指向不同类型派生类对象时,通过虚函数到基类或派生类中同名函数的映射实现多态。 动态多态:重载函数表现的是静态多态性,虚函数表现的是动态多态性: 重载函数是静态多态函数,通过静态绑定完成重载函数的调用;虚函数是动态多态函数,通过动态绑定完成虚函数的调用。动态绑定是程序自己完成的,静态绑定是编译或操作系统完成的。 虚函数的动态绑定通过存储在对象中的一个指针完成。(该指针指向虚函数入口地址表VFT) 定义:virtual 函数原型 【例7.1】 7.1 虚函数 虚函数使用说明: 虚函数必须是类的成员函数,非成员函数不能说明为虚函数,普通函数如main不能说明为虚函数(与编译器有关)。 虚函数一般在基类的public或protected部分。在派生类中重新定义成员函数时,函数原型必须完全相同; 虚函数只有在具有继承关系的类层次结构中定义才有意义,否则引起额外开销 (需要通过VFT访问); 一般用父类指针(或引用)访问虚函数。根据父类指针所指对象类型的不同,动态绑定相应对象的虚函数;(虚函数的动态多态性) 【例7.1】 7.1 虚函数 虚函数使用说明(续): 虚函数有隐含的this参数,参数表后可出现const和volatile,静态函数成员没有this参数,不能定义为虚函数:即不能有virtual static之类的说明; 构造函数构造对象的类型是确定的,不需根据类型表现出多态性,故不能定义为虚函数;析构函数可通过父类指针(引用)或delete调用,父类指针指向的对象类型可能是不确定的,因此析构函数可定义为虚函数。 一旦父类(基类)定义了虚函数,即使没有“virtual”声明,所有派生类中原型相同的非静态成员函数自动成为虚函数;(虚函数的无限传递性) 【例7.2】 7.1 虚函数 虚函数使用说明(续): 虚函数只能定义为其他类的友元,而不能定义为当前类的友元(友元非当前类的成员)。即不能同时用virtual 和friend 定义函数。 虚函数同普通函数成员一样,可声明为或自动成为inline函数,也可重载、缺省和省略参数。【例7.3】 虚函数能根据对象类型适当地绑定函数成员,且绑定函数成员的效率非常之高,因此,最好将普通函数成员全部定义为虚函数。 注意:虚函数主要通过基类和派生类表现出多态特性,由于union既不能定义基类又不能定义派生类,故不能在union中定义虚函数。 7.1 虚函数 虚函数与重载成员函数的区别: 重载函数使用静态联编(绑定)机制;虚函数采用动态联编机制; 对于父类A中声明的虚函数f( ),若在子类B中重定义f( ),必须确保子类B::f( )与父类A::f( )具有完全相同的函数原型,才能覆盖原虚函数f( )而产生虚特性,执行动态联编机制。否则,只要有一个参数不同,编译系统就认为它是一个全新的(函数名相同时重载)函数,而不实现动态联编。 7.2 虚析构函数 虚析构函数: 如果基类的析构函数定义为虚析构函数,则派生类的析构函数就会自动成为虚析构函数。 说明虚析构函数的目的在于在使用delete运算符删除一个对象时,能够保证所执行的析构函数就是该对象的析构函数;最好将所有的析构函数都定义为虚析构函数。 注意:如果为基类和派生类的对象分配了动态内存,或者为派生类的对象成员分配了动态内存,则一定要将基类和派生类的析构函数定义为虚析构函数,否则便可能造成内存泄漏,导致系统出现内存保护错误。 7.2 虚析构函数 【例7.4】输入职员的花名册,如果职员的姓名、编号和年龄等信息齐全,则登记该职员的个人信息,否则只登记职员的姓名。 7.2 虚析构函数 7.2 虚析构函数 补充说明: 用父类引用实现动态多态性时需要注意,若被(new产生)引用对象自身不能析构,则必须用delete 析构: STRING z=*new CLERK(zang,982021,23); delete z; //析构对象z并释放对象z占用的内存 上述delete z完成了两个任务:①调用该对象析构函数,释放其基类和对象成员各自为字符指针str分配的空间;②释放CLERK对象自身占用的存储空间。 如果将上述delete z改为z.~CLERK( ),则只完成任务①而没完成任务②;如果改为free(z),则只完成任务②而没完成任务①。造成内存泄露。为什么? 7.3 抽象类 纯虚函数:不必定义函数体的虚函数,也可以重载、缺省参数、省略参数、内联等,相当于Java

文档评论(0)

zhuwenmeijiale + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:7065136142000003

1亿VIP精品文档

相关文档