开始部分的指令在前面几篇中陆续解释过,这里不再详述。我们看看第15是对父类的构造函数C180::C180()的调用,根据前文的说明,我们知道此时ecx中放的是this指针,也就是C190对象的地址。这时如果跳到this指针批向的地址看看会发现值为0xcccccccc即没有初始化,虚表指针也没有被初始化。那么我们跟着跳到C180的构造函数看看。
| 01 00427040 push ebp 02 00427041 mov ebp,esp 03 00427043 sub esp,0CCh 04 00427049 push ebx 05 0042704A push esi 06 0042704B push edi 07 0042704C push ecx 08 0042704D lea edi,[ebp+FFFFFF34h] 09 00427053 mov ecx,33h 10 00427058 mov eax,0CCCCCCCCh 11 0042705D rep stos dword ptr [edi] 12 0042705F pop ecx 13 00427060 mov dword ptr [ebp-8],ecx 14 00427063 mov eax,dword ptr [ebp-8] 15 00427066 mov dword ptr [eax],45C404h 16 0042706C mov ecx,dword ptr [ebp-8] 17 0042706F call 0041DA8C 18 00427074 mov ecx,dword ptr [ebp-8] 19 00427077 call 0041DA8C 20 0042707C mov eax,dword ptr [ebp-8] 21 0042707F pop edi 22 00427080 pop esi 23 00427081 pop ebx 24 00427082 add esp,0CCh 25 00427088 cmp ebp,esp 26 0042708A call 0041DDF2 27 0042708F mov esp,ebp 28 00427091 pop ebp 29 00427092 ret |
| struct __declspec(novtable) C180 { C180() { foo(); this->foo(); } virtual foo() { cout << "<< C180.foo this: " << this << " vtadr: " << *(void**)this << endl; } }; |
| << C180.foo this: 0012F7A4 vtadr: CCCCCCCC << C180.foo this: 0012F7A4 vtadr: CCCCCCCC << C190.foo this: 0012F7A4 vtadr: 0045C400 |