虚函数

struct Base
{
void Func1()
{
printf(“func1”);
}

virtual void Func2()
{
	printf("func2");
}

};
int _tmain(int argc, _TCHAR* arg)
{
Base base;
base.Func1();
base.Func2();

反汇编代码
19: Base base;
00F543B8 8D 4D F4 lea ecx,[ebp-0Ch]
00F543BB E8 7C CC FF FF call 00F5103C
20: base.Func1();
00F543C0 8D 4D F4 lea ecx,[ebp-0Ch]
00F543C3 E8 C6 CF FF FF call 00F5138E
21: base.Func2();
00F543C8 8D 4D F4 lea ecx,[ebp-0Ch]
00F543CB E8 57 CD FF FF call 00F51127
当用对象访问虚函数时 与普通函数一样 是直接调用

当用指针访问时
Base base;
Base* pBase = &base;
pBase->Func1();
pBase->Func2();
反汇编代码
00B748C8 8D 4D F4 lea ecx,[ebp-0Ch]
00B748CB E8 6C C7 FF FF call 00B7103C
20: Base* pBase = &base;
00B748D0 8D 45 F4 lea eax,[ebp-0Ch]
00B748D3 89 45 E8 mov dword ptr [ebp-18h],eax
21: pBase->Func1();
00B748D6 8B 4D E8 mov ecx,dword ptr [ebp-18h]
00B748D9 E8 B0 CA FF FF call 00B7138E
22: pBase->Func2();
00B748DE 8B 45 E8 mov eax,dword ptr [ebp-18h]
00B748E1 8B 10 mov edx,dword ptr [eax]
00B748E3 8B F4 mov esi,esp
00B748E5 8B 4D E8 mov ecx,dword ptr [ebp-18h]
00B748E8 8B 02 mov eax,dword ptr [edx]
00B748EA FF D0 call eax
当用指针访问虚函数时,是间接调用
虚表
当类里面有虚函数在定义对象后,会产生一个虚表在this指针的的前4字节。
在这里插入图片描述
箭头指向的就是虚表的地址

一个派生类有多个直接的父类时,就会有多个虚函数地址表
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值