多态性与虚函数表——内存分布

转载:多态性与虚函数表——内存分布

  (2011-10-19 00:24:14)
http://blog.sina.com.cn/s/blog_7c983ca60100yn1r.html

http://blog.sina.com.cn/s/blog_60e96a410100lirk.html
       虚表这里,自己搞懂了,过一段时间就又忘了,尤其是有虚函数的时候整个内存的分布情况。转载一篇日志,对其进行整理,方便自己以后查阅。
C++中的成员和函数,有静态和非静态。
1、非静态数据成员:放在每一个对象体内,作为对象专有的数据成员。
2、静态数据成员:被提取出来放在程序的静态数据区内,为该类所有对象共享,因此只存在一份。( 引申下,一个类模板中的静态数据成员实例化成模板类之后有几份?思考下。
3、静态和非静态成员函数:最终都被提取出来放在程序的代码中并为该类所有对象共享。因每一个成员函数也只能存在一份代码尸体。 在C++中的类的成员函数都是保存在静态存储区中,那静态函数也是保存在静态存储区中,他们都是在类中保存同一个备份
       构成对象本身的只有数据,非静态成员函数与对象的关系就是绑定,绑定的中介是this指针。成员函数为该类所有对象共享。
4、单继承的对象的内存布局:第一个为虚函数表指针vtbl,其后为成员且 先基类后子类。虚函数表里包含了所有虚函数的地址,以NULL结束。 虚函数如果子类有重写,就由子类的重新的代替
转载:多态性与虚函数表——内存分布
     上述类图的解释:B的V2覆盖了A的V2,C的V1覆盖了A的V1,C的V3覆盖了B的V3。( 区分:覆盖、重载、隐藏、重写
        类C对象的内存模型: 转载:多态性与虚函数表——内存分布
单继承的对象的布局,第一个为虚函数表指针Vtbl,其后为成员且先基类后子类,虚函数表里包含了所有的虚函数的地址,以NULL结束。虚函数如果子类有重写,就由子类的重新的代替。( 注意,虚函数表是类所有,而虚函数表指针才是每个对象所有的,所以有虚函数的对象的地址会增加4,是指针的长度
5、多重继承:所有的虚函数也都包含在虚函数表中,但不同的是多重继承有多个虚函数表, (1)当子类对父类的虚函数有重写时,子类的函数替换父类的函数在对应的虚函数位置,(2)当子类有新的虚函数时,这些虚函数被加在第一个虚函数表的后面。
         转载:多态性与虚函数表——内存分布
    D的V3覆盖了B3的V3,另外D有一个新的虚函数VD。
    Class D的内存模型
转载:多态性与虚函数表——内存分布

总结: 与单继承相同的是所有的虚函数都包含在虚函数表中,所不同的是多重继承有多个虚函数表,当子类对父类的虚函数有重写时,子类的函数覆盖父类的函数在对应的虚函数位置,当子类有新的虚函数时,这些虚函数被加在第一个虚函数表的后面。
6、虚继承:使用公共的基类在子类中只有一份,我们看到虚继承在多重继承的基础上多了vtable来存储到公共基类的偏移。
转载:多态性与虚函数表——内存分布
    D2覆盖了B的VB,GD覆盖了D1的VD1同时也覆盖了B的VB,GD也有自己的虚函数VGD。
    class GD的内存模型
转载:多态性与虚函数表——内存分布

总结: 虚继承,使公共的基类在子类中只有一份,我们看到虚基类在多重继承的基础上多了vtable来存储到公共基类的偏移。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值