




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C+学习笔记(13)利用对象、引用、指针调用虚函数虚函数实现原理说明: 在“C+学习笔记(12)多态与虚函数”中,每个类的大小比起所有成员数据多4个字节,表明有虚函数的类的大小还要加上一个紧缩的空指针类型的大小。这说明了该在包含虚函数的类中,编译系统自动加入了一些表明类型的信息。当一个类中拥有虚函数时,编译系统将为该类创建一个数组VTABLE。VTABLE的元素是虚函数的地址,且同一虚函数的地址在基类和派生类的VTABLE中相对首位置的偏移是一样的。同时,编译系统还加入了相应的调用虚函数的代码。所有这些都是不需要程序员作的工作,由系统自动完成。在初始化该类对象时,将加入一个指向VTABLE的指针,这个指针一般称为VPTR。一般来说,VPTR位于该类对象的存储单元的最开始部位。 这样,当VPTR被正确的初始化之后,便指向了该对象的VTABLE,从而在对象及其特定的虚函数定义间建立了联系。从虚函数调用的意义上来说,VPTR表明了类型信息,因为它使得调用与类型相符合。 本例(见下文)可以看到,不管类层次进行了多少扩充,对于已有类对象的操作都不必作出改动。从这一点来看,虚函数所体现的运行时多态,大大提高了软件的可扩充性。我们知道,系统的设计者在初期集中于整个系统框架的合理构建,而在后期进行具体问题的分析,并逐渐扩充该框架。运行时多态保证了分析、设计、实现和扩充各个阶段的统一,使得系统的设计者在各阶段可以集中于眼前的工作,而不必为了以后不可预见的变化付出代价。虚函数总结: 虚函数只能是类成员函数,它在基类体内部说明,目的是提供一种接口界面;l 虚函数不能是友元函数(即非成员函数),也不能是静态成员函数,因为虚函数调用要靠特定的对象来决定该激活哪个函数。虚函数可以在另一个类中被声明为友元函数; 一旦一个函数定义为虚函数,那么无论它传下多少层,都将保持为虚函数,而不必每次都加关键字virtual;l l 基类的虚函数可在一个或多个派生类中被重新定义,但其原型与基类必须完全相同(即返回类型、函数名、参数个数、类型及顺序一样),否则系统将认为派生类中的函数是重载的,而非虚函数;如果仅有返回类型不同,那么编译将出错; l 要虚函数发挥作用,必须用基类的指针(或引用)指向派生类的对象,并用指针(或引用)调用虚函数。也就是说,只有用地址才能体现运行多态性。因为不论是指向基类还是指向派生类的指针(引用),大小都是一样的,这样才能用基类指针指向派生类对象。这时,指针提供的信息是不完全的,在编译阶段不知道应该调用虚函数的哪个版本。而如果用对象调用虚函数,由于类型已经确定了,因此编译系统很可能采用预绑定; l 由于包含虚函数的基类指针可以指向其不同的派生类,并可执行不同版本的虚函数,提供了实现程序运行的多态性方法,因而将包含虚函数的类称为多态类。 虚函数与一般重载函数的区别: 重载函数在类型和参数数量上一定不相同,而重定义的虚函数则要求参数的类型和个数、函数返回类型相同;l 虚函数必须是类的成员函数,重载的函数则不一定是这样; 构造函数可以重载,但不能是虚函数,析构函数可以是虚函数。l 指针的转换规则: 指向基类的指针,可以指向它的公有派生的对象,但不能指向私有派生的对象;l 只能利用它直接访问派生类从基类继承来的成员,不能直接访问公有派生类中特定的成员; 不能将指向派生类对象的指针指向其基类的一个对象。l 当虚函数在操作中引用的基类数据成员无法被派生类直接引用时(例如被隐藏的成员),便会出现错误。为了使用虚函数达到最好的动态联编效果,一般应以该虚函数第一次出现的类的引用体或指针作为参数,避免不确定因素。 代码如下: /*/*利用对象、引用、指针调用虚函数*/#include/基类classCBx;public:CBase(intn).x=n;virtualvoidPrintX().coutCBase:PrintX:xendl;/派生类classCDerive:publicCBx;public:CDerive(intn1,intn2):CBase(n1).x=n2;voidPrintX().coutCDerive:PrintX:xendl;CBase:PrintX();/子派生类classCSubDerive:publicCDx;public:CSubDerive(intn1,intn2,intn3):CDerive(n1,n2).x=n3;voidPrintX().coutCSubDerive:PrintX:xendl;CDerive:PrintX();voidmain().coutCBasesize=sizeof(CBase)endl;coutCDerivesize=sizeof(CDerive)endl;coutCSubDerivesize=sizeof(CSubDerive)endl;coutendl;CBaseobj1(1);CDeriveobj2(2,3);CSubDeriveobj3(4,5,6);obj1.PrintX();obj2.PrintX();obj3.PrintX();coutPrintX();pObj2-PrintX();pObj3-PrintX();coutPrintX();pObj1-PrintX();pObj2-PrintX();coutendl;CBase&yobj1=obj1;CBase&yobj2=obj2;CBase&yobj3=obj3;yobj1.PrintX();yobj2.PrintX();y
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 瑜伽课件理由
- 2025年事业单位工勤技能考试练习题附答案详解
- 2025年陕西省安康市事业单位工勤技能考试题库及答案
- 2026年高考总复习优化设计一轮复习历史(广西版)-第6讲 辽宋夏金元的经济、社会与文化
- 社保公司面试题目及答案
- 2025年砌筑工职业技能鉴定试卷(施工信息化)
- 江阴职业技术学院《三笔技能》2024-2025学年第一学期期末试卷
- 开封大学《人工智能引论》2024-2025学年第一学期期末试卷
- 南方科技大学《现代生物仪器分析》2024-2025学年第一学期期末试卷
- 福州英华职业学院《实验室安全教育》2024-2025学年第一学期期末试卷
- 关节松动技术-上肢关节松动术(运动治疗技术)
- 2024CSCO肿瘤患者静脉血栓防治指南解读
- 供应商改善计划表
- DB11-T 1253-2022 地埋管地源热泵系统工程技术规范
- 2022年临沧市市级单位遴选(选调)考试试题及答案
- JBT 11699-2013 高处作业吊篮安装、拆卸、使用技术规程
- 中专宿舍管理制度和方法
- 心态决定-切模板课件
- 精神科常见病小讲课
- 屁屁辅助脚本
- 高效沟通提升医药代表拜访技巧的五大秘诀
评论
0/150
提交评论