2022年虚函数的真相完整版 .pdf
《2022年虚函数的真相完整版 .pdf》由会员分享,可在线阅读,更多相关《2022年虚函数的真相完整版 .pdf(7页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、本文主要参考:C+虚函数调用的反汇编解析(1)virtual 虚函数先看一段简单代码:Code Segment:Line01:#include Line02:Line03:class Base Line04:public:Line05:virtual void _stdcall Output()Line06:printf(Class Basen);Line07:Line08:;Line09:Line10:class Derive:public Base Line11:public:Line12:void _stdcall Output()Line13:printf(Class Deriven)
2、;Line14:Line15:;Line16:Line17:void Test(Base*p)Line18:p-Output();Line19:Line20:Line21:int _cdecl main(int argc,char*argv)Line22:Derive obj;Line23:Test(&obj);Line24:return 0;Line25:基类的“Output”函数是个虚函数。那么,很明显地,程序的运行结果将是:基类的“Output”函 数 是 个 虚 函数。名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 7 页 -(1)virtual function tab
3、le 虚函数表对应的汇编码观察“variables”先来分析我们的main 函数中的Derive 类的对象obj,看看它的内存布局,由于没有数据成员,它的大小为4 个字节,只有一个vfptr,所以 obj 的地址也就是vfptr 的地址了。对一个 C+类,如果它要呈现多态(一般的编译器会将这个类以及它的基类中是否存在virtual 关键字作为这个类是否要多态),那么类会有一个virtual function table,而每一个实例(对象)都会有一个virtual function pointer(以下简称vfptr)指向该类的virtual function table的起始地址,而 vir
4、tual function table 表格地址所对应的内存单元的内容就是虚函数地址(其实并不是真正的函数地址,而是跳转到函数的jmp 指令的地址)。为 Deriver 自动 创 建 构 造函数。Virtual function pointer 应该是 Output 函数的首地址,但究竟是基类还是子类的首地址?名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 7 页 -(2)实现 virtual 功能这是自动创建的Deriver 的代码观察“Registers”继续向下运行到由这里 跟踪进去观察Test函数观察“Address”ECX 保存的地址就是“00401060”将 virt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年虚函数的真相完整版 2022 函数 真相 完整版
限制150内