虛函式的識別2

2021-07-22 17:42:36 字數 2072 閱讀 5873

1.虛函式呼叫過程:

void showspeak(cperson * pperson)

pperson->showspeak();

00407cfe 8b 45

08mov eax,dword ptr [pperson]

00407d01 8b 10

mov edx,dword ptr [eax] ;取虛表首位址

00407d03 8b f4 mov esi,esp

00407d05 8b 4d 08

mov ecx,dword ptr [pperson] ;設定this指標

;利用虛表指標edx,間接呼叫函式。由於showspeak在父類中是第二個宣告的虛函式,所以這裡用edx+4

00407d08 8b 42

04mov eax,dword ptr [edx+4]

00407d0b ff d0 call eax

2.建構函式和析構函式中呼叫虛函式

建構函式:

cchinese chinese;

00407fad 8d 4d ec lea ecx,[chinese]

00407fb0 e8 15 b7 ff ff call cchinese::cchinese (04036cah)

cchinese::cchinese:

004036ca e9 71 40 00 00 jmp cchinese::cchinese (0407740h)

cchinese(){}

0040775f 59 pop ecx

00407760 89 4d f8 mov dword ptr [this],ecx

00407763 8b 4d f8 mov ecx,dword ptr [this]

00407766 e8 be b0 ff ff call cperson::cperson (0402829h)

0040776b 8b 45 f8 mov eax,dword ptr [this]

0040776e c7 00 74 8e 49 00 mov dword ptr [eax],offset cchinese::`vftable' (0498e74h)

00407774 8b 45 f8 mov eax,dword ptr [this]

cperson::cperson:

00402829 e9 d2 4f 00 00 jmp cperson::cperson (0407800h)

cperson(){

0040781f 59 pop ecx

00407820 89 4d f8 mov dword ptr [this],ecx

00407823 8b 45 f8 mov eax,dword ptr [this]

00407826 c7 00 54 8e 49 00 mov dword ptr [eax],offset cperson::`vftable' (0498e54h)

showspeak();

0040782c 8b 4d f8 mov ecx,dword ptr [this] ;虛表是父類的,可以直接呼叫父類虛函式

0040782f e8 a1 9a ff ff call cperson::showspeak (04012d5h)

虛函式的識別1

1.有虛函式的類在編譯中會加入乙個隱藏資料成員,虛表指標。這就使得類的大小比資料成員的大小大4。2.使用預設建構函式時,建構函式中會出現虛表指標,特徵是二次跳轉後到跳轉表,虛函式表。cvirtual myvirtual 004076d5 8d 4d e8lea ecx,myvirtual 00407...

虛函式和多型 2

虛函式和多型 2 檢視提交 統計提問 總時間限制 5000ms 記憶體限制 65535kb 描述由於球體和圓柱體都可以看做由圓繼承而來,所以可以定義圓類circle作為基類。在circle類中定義乙個資料成員radius和兩個虛函式area 和volume 由circle類派生sphere類和col...

虛指標,虛函式,虛函式表,純虛函式

虛指標 虛繼承 在使用多重繼承時,如存在 class a 有m a變數 class a1 virtual public a,m a1 class a2 virtual public a m a2 class b public a1,public a2 m b 時 存在以下記憶體儲存順序 虛指標 指向...