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