1.有虛函式的類在編譯中會加入乙個隱藏資料成員,虛表指標。這就使得類的大小比資料成員的大小大4。
2.使用預設建構函式時,建構函式中會出現虛表指標,特徵是二次跳轉後到跳轉表,虛函式表。
cvirtual
myvirtual;
004076d5 8d 4d
e8lea
ecx,[myvirtual]
004076d8
e8a5
c6ff
ffcall
cvirtual
::cvirtual (0403d82h) ;呼叫預設建構函式
;虛表
_memmove:
00403d78 e9 c3 bf 08
00jmp memmove (048fd40h)
charnode::length:
00403d7d e9 7e 5d 01
00jmp charnode::length (0419b00h)
cvirtual::cvirtual:
00403d82 e9 49
3800
00jmp cvirtual::cvirtual (04075d0h) ;跳轉
__get_thread_local_invalid_parameter_handler:
00403d87 e9 74 a1 05
00jmp _get_thread_local_invalid_parameter_handler (045df00h)
;預設建構函式
cvirtual::cvirtual:
004075d0
55push ebp
004075d1 8b ec mov ebp,esp
004075d3 81 ec cc 00
0000
sub esp,0cch
004075d9 53 push ebx
004075da 56 push esi
004075db 57 push edi
004075dc 51 push ecx
004075dd 8d bd 34 ff ff ff lea edi,[ebp-0cch]
004075e3 b9 33 00 00 00 mov ecx,33h
004075e8 b8 cc cc cc cc mov eax,0cccccccch
004075ed f3 ab rep stos dword ptr es:[edi]
004075ef 59 pop ecx
004075f0 89 4d f8 mov dword ptr [this],ecx
004075f3 8b 45 f8 mov eax,dword ptr [this]
004075f6 c7 00 54 8e 49 00 mov dword ptr [eax],offset cvirtual::`vftable' (0498e54h)
; 虛表指標
004075fc 8b 45 f8 mov eax,dword ptr [this]
004075ff 5f pop edi
00407600
5e pop esi
00407601
5b pop ebx
00407602
8b e5 mov esp,ebp
00407604
5d pop ebp
00407605 c3 ret
;虛表中位置 004034bd 00402ca2 一次跳轉
00498e53 ?? ?? ??
00498e54 bd 34
4000 a2 mov ebp,0a2004034h
00498e59
2c 40
sub al,40h
00498e5b 00
00
004034bd 二次跳轉
@_guard_check_icall_nop@4:
004034b8 e9 93
7100
00jmp _guard_check_icall_nop (040a650h)
cvirtual::getnumber:
004034bd e9 5e 41
0000
jmp cvirtual::getnumber (0407620h)
___acrt_show_wide_message_box:
004034c2 e9 29 d2 05
00jmp __acrt_show_wide_message_box (04606f0h)
00402ca2 二次跳轉
__expand_base:
00402c9d e9 de 61
0700
jmp _expand_base (0478e80h)
cvirtual::setnumber:
00402ca2 e9 b9 49
0000
jmp cvirtual::setnumber (0407660h)
3.虛函式的識別:
類中隱式定義了乙個資料成員
該資料成員在首位址處,佔4位元組
建構函式會將此資料成員初始化為某個陣列的首位址
這個位址屬於資料區,是相對固定的位址
在這個資料內,每個元素都是函式指標
他們被呼叫時,第乙個引數必然是this指標
在這些函式內部,很有可能會對this指標使用相對間接的使用方式
虛函式的識別2
1.虛函式呼叫過程 void showspeak cperson pperson pperson showspeak 00407cfe 8b 45 08mov eax,dword ptr pperson 00407d01 8b 10 mov edx,dword ptr eax 取虛表首位址 0040...
C 虛函式和純虛函式(1)
學習過c 類的繼承與多型的時候,但是很多的童鞋回過頭來都忘記之中關於虛函式和純虛函式的細節,甚至將他們混淆。虛函式是動態多型性的基礎,其呼叫的方式是動態聯編 又稱晚期聯編,簡單解釋為只有在程式執行時才決定呼叫基類的還是子類的,系統會根據基類指標所指向的物件來決定要呼叫的函式 非虛函式與其相反,是靜態...
C 虛函式和純虛函式(1)
寫在前面的 學習過c 類的繼承與多型的時候,但是很多的童鞋回過頭來都忘記之中關於虛函式和純虛函式的細節,甚至將他們混淆。虛函式是動態多型性的基礎,其呼叫的方式是動態聯編 又稱晚期聯編,簡單解釋為只有在程式執行時才決定呼叫基類的還是子類的,系統會根據基類指標所指向的物件來決定要呼叫的函式 非虛函式與其...