扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
class C0 ...{ public: void Test() ...{ cout << "call C0 Test()。" << endl; } }; |
// 静态编译(早绑定 early binding) C0 *pO0; C0 obj0; pO0 = &obj0; pO0->Test(); 它的反汇编代码如下: // 直接调用函数(已经知道地址) 00401432 mov ecx,dword ptr [ebp-0Ch] 00401435 call @ILT+160(C0::Test) (004010a5) 下面看看带虚函数的类: class C1 ...{ public: virtual void Test() ...{ cout << "call C1 Test()" << endl; } }; class C11 : public C1 ...{ public: void Test() ...{ cout << "call C11 Test()" << endl; } }; |
C11 obj11; C1 *pObj1; pObj1 = &obj11; // 这里生成的汇编代码 // 0040144A lea edx,[ebp-14h] // 寻址找到pObj1 // 0040144D mov dword ptr [ebp-1Ch],edx pObj1->Test(); // 这里生成的汇编代码 // 00401450 mov eax,dword ptr [ebp-1Ch] // 取得虚表地址 // 00401453 mov edx,dword ptr [eax] // 00401455 mov esi,esp // 00401457 mov ecx,dword ptr [ebp-1Ch] // 根据虚表的位置来取得Test()函数 // 0040145A call dword ptr [edx] // 调用Test()函数 |
class C1 ...{ public: virtual void Test() ...{ cout << "call C1 Test()" << endl; } }; class C11 : public C1 ...{ public: void Test() ...{ cout << "call C11 Test()" << endl; } }; class C12 : public C1 ...{ public: void Test() ...{ cout << "call C12 Test()" << endl; } }; |
// 验证首地址 C11 obj110; C11 obj111; printf("obj110 的地址:%x ", &obj110); printf("obj111 的地址:%x ", &obj111); printf("obj110 虚表的地址:%x ", *(&obj110)); printf("obj111 虚表的地址:%x ", *(&obj111)); |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者