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