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 時 存在以下記憶體儲存順序 虛指標 指向...