1.虚函数引入类中之后,类会发生什么变化?

首先我们创建一个空类A,然后创建一个类的对象a,并打印它的占用空间大小 —为1

 

 

 

我们再往类中添加两个成员函数后,再返回对象a的占用空间大小发现还是1

说明类A 的普通成员函数不占用类对象的内存空间

 

 

如果我们在类中添加一个虚函数后,对象的占用空间大小就变成 4

说明在添加虚函数之后,编译器会向类中插入一个看不见的成员变量(虚函数表指针vptr)virtual table pointer —4字节 而它占用类对象a的内存空间

 

 

 

2.虚函数表的生成时机和生成原因:

当类A中至少存在一个虚函数时,在编译期间,编译器就会为类A生成一个虚函数表virtual table(vtbl)

 

 

 

 

 

 

 

 

 虚函数表会一直伴随类A一直到内存中

 

3.虚函数表指针被赋值的时机

 

虚函数表指针与虚函数表的关系:

 

 

 

 

对于含有虚函数的类A ,编译器会在编译过程中在构造函数中穿插为虚函数表指针赋值的语句

 

使得虚函数表指针指向虚函数表

 

 

 

4.类对象在内存中的布局:

完整的类A对象代码:

 

 

 

 连接方式与布局:

虚函数指针指向虚函数表,虚函数表包含所有虚函数的指针

 

 

 

5.虚函数的工作原理,多态性的体现:

多态的体现:

父类子类拥有同名虚函数的情况下

父类指针new一个*子类对象或者通过父类引用来绑定一个&子类对象时

父类中,使父类指针或者引用去调用虚函数

那么实际调用的是子类的虚函数

 

 

 两个方面理解多态:

原则:

 

 

 

代码实现上:

如果是 vptr -> vtbl -> 虚函数 这个路线 那么就体现了多态性  (用对应的汇编代码查看调用情况)

直接像普通成员函数调用就不是多态

 

 

 

表现形式上:

原则:

 

 

示例:

 

 

布局:(存在override覆盖现象)

 

原文地址:http://www.cnblogs.com/slowlydance2me/p/16875399.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性