如果取這個類的大小,可以看到結(jié)果是8而不是4。下面聲明這個類的一個實例,并取得其VTABLE中第一個元素的值:
注意取值的這一行運用了復(fù)雜的強(qiáng)制類型轉(zhuǎn)換。我把它拆開解釋一下。首先是取得對象pC的前四個字節(jié)的內(nèi)容,只要把pC轉(zhuǎn)換成int*然后直接取值就行了:?*(int*)pC下一步是把取得的這個值當(dāng)作是一個指針,也就是再進(jìn)行一次強(qiáng)制類型轉(zhuǎn)換:?(int*)(*(int*)pC)最后取這個指針?biāo)竷?nèi)存的內(nèi)容,也就是VTABLE中第一個函數(shù)的地址了:?*(int*)(*(int*)pC)取得這個地址以后,下面就用匯編代碼來調(diào)用這個地址所指的函數(shù):
注意調(diào)用類的非靜態(tài)成員函數(shù)時需要先把對應(yīng)實例的地址放到ECX寄存器中,也就是平常所說的“隱藏參數(shù)”了,然后為函數(shù)Print壓兩個參數(shù)進(jìn)棧,根據(jù)運行的結(jié)果可以明顯看出來調(diào)用類成員函數(shù)時也是從右向左壓棧的,最后用call語句調(diào)用函數(shù)。不難發(fā)現(xiàn)調(diào)用類成員函數(shù)在參數(shù)個數(shù)確定時也是由被調(diào)用者負(fù)責(zé)彈棧,看來類成員函數(shù)也是可以聲明為參數(shù)個數(shù)可變的函數(shù)了。最后,執(zhí)行程序,得到結(jié)果:i=1 a=2 b=3?