日期:2011-03-22 13:55:00 来源:本站整理
<b>C++对象筹划及多态实现摸索之虚函数调用</b>[VC/C++编程]
本文“<b>C++对象筹划及多态实现摸索之虚函数调用</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
我们再看看虚成员函数的调用.类C041中含有虚成员函数,它的定义以下:
struct C041
{
C041() : c_(0x01) {}
virtual void foo() { c_ = 0x02; }
char c_;
};
履行以下代码:
C041 obj;
PRINT_DETAIL(C041, obj)
PRINT_VTABLE_ITEM(obj, 0, 0)
obj.foo();
C041 * pt = &obj;
pt->foo();
后果以下:
The detail of C041 is 14 b3 45 00 01
obj : objadr:0012F824 vpadr:0012F824 vtadr:0045B314 vtival(0):0041DF1E
我们打印出了C041的对象内存筹划及它的虚表信息.
先看看obj.foo();的汇编代码:
004230DF lea ecx,[ebp+FFFFF948h]
004230E5 call 0041DF1E
和前一篇文章中看过的普通的成员函数调用产生的汇编代码一样.这阐明了通过对象举行函数调用,即便被调用的函数是虚函数也是静态绑定,即在编译时抉择出函数的地址.不会有多态的行为发生.
我们跟踪进去看看函数的汇编代码.
01 004263F0 push ebp
02 004263F1 mov ebp,esp
03 004263F3 sub esp,0CCh
04 004263F9 push ebx
05 004263FA push esi
06 004263FB push edi
07 004263FC push ecx
08 004263FD lea edi,[ebp+FFFFFF34h]
09 00426403 mov ecx,33h
10 00426408 mov eax,0CCCCCCCCh
11 0042640D rep stos dword ptr [edi]
12 0042640F pop ecx
13 00426410 mov dword ptr [ebp-8],ecx
14 00426413 mov eax,dword ptr [ebp-8]
15 00426416 mov byte ptr [eax+4],2
16 0042641A pop edi
17 0042641B pop esi
18 0042641C pop ebx
19 0042641D mov esp,ebp
20 0042641F pop ebp
21 00426420 ret
值得注意的是第14、15行.第14行把this指针的值移到eax存放器中,第15行给类的第一个成员变量赋值,这时我们可以看到在取变量的地址时用的是[eax+4],即跳过了对象筹划最前面的4字节的虚表指针.
以上是“<b>C++对象筹划及多态实现摸索之虚函数调用</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论