反汇编:虚函数表
多态中virtual
的工作原理
正常实现多态的代码
#include "stdafx.h" class Base{ public: virtual HowVirtual(){ printf("the Base virtual"); } }; class Son:public Base{ public: virtual HowVirtual(){ printf("the Son virtual"); } }; void theVir(Base& fath){ fath.HowVirtual(); } int main(int argc, char* argv[]) { Base b; Son s; //theVir(s); //theVir(b); printf("\n"); return 0; }
问题:为什么可以实现多态的功能?也就是相同方法下,编译器是如何判断传入的是哪个对象所以调用该对象实现的方法的?
如下地方进行断点,然后进行运行,可以发现每个对象中都会存在一个__vfptr
名称的一个指针,该指针指向一个地址为0x00422f9c
和0x0042210c
,展开选项为如下:
这里面最终的地址分别是指向的是00401019
,0040102d
,然后跟过去00401019
发现是个跳转,如下:
00401019 jmp Base::HowVirtual (0040d8c0)
那么跟0040d8c0
可以发现是Base::HowVirtal
方法
而子类的虚拟表中同样进行操作,发现结果是如下:
0040102D jmp Son::HowVirtual (0040d950)
那么大家就可以理解了,使用virtual
的时候能够实现多态的功能!
还需要注意的是
1、实现了虚函数则会在当前对象中占四个字节,因为它是一个指向虚函数表的一个指针
2、当虚函数越多的时候,__vfptr
地址中保存的值只是存储所有虚函数的首地址(也就是该地址只是保存了真正虚拟表的地址),比如现在定义了两个虚函数,如下:
继续跟发现如下:虚函数是连续的!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 上周热点回顾(1.20-1.26)
· 【译】.NET 升级助手现在支持升级到集中式包管理