反彙編之C 的虛函式

2021-08-23 14:12:26 字數 1516 閱讀 7220

先來檢視一簡單例子

#includeusing namespace std;class base};class derive : public base

};

int main()

用vs2015除錯一番.檢視pb儲存子物件的位址.

以上pb儲存了子類物件的位址,位址為0x003bfb64.來看看.這個子類物件的首4個位元組(32位機子)位址儲存了啥內容(其實是虛函式表的位址)

子類物件首4個位元組儲存了00948b34這個數值.(這個其實是虛函式表的位址).再來看看這個數值儲存了啥內容.

發現這個位址開始 0094142e跟00941424應該就是虛函式的位址了.不信.咋們到反彙編檢視該位址內容.

先檢視0x0094142e(函式轉為反彙編.其實第乙個位址就是跳轉).發現沒.反彙編已經提示了是derive::f這個函式

再看看0x00941424.是base::g這個函式

以上可知.一般編譯器實現.把虛函式表的位址用放在子物件首4個位元組.虛函式表儲存的是虛函式的位址.

void(*f)(derive*) = (void(*)(derive*))(*(int*)(*q));//取出f()函式位址

void(*g)(derive*) = (void(*)(derive*))(*(int*)(*q+4));//取出g()函式地

比如以上2行.q是子物件的位址.(*q)就是虛函式表的位址 (*q)+4 相當於虛函式的第二個元素的位址. *(int*)(*q)表示第乙個虛函式的位址.*(int*)(*q+4));表示第二個虛函式表的位址..最後強制轉換為類成員函式.用(void(*)(derive*).因為一般類成員函式在編譯後.首形參是乙個this指標.這裡用derive*.因為this指標的型別就是類的型別

f((derive*)pb);//呼叫子物件虛函式表的第乙個元素

g((derive*)pb);//呼叫子物件虛函式表的第二個元素

最後呼叫這2個虛函式表中的虛函式.把pb(子物件的位址)當做引數this指標.然後直接呼叫.即可使得函式被呼叫了

C 虛函式呼叫的反彙編解析

虛函式的呼叫如何能實現其 虛 作為c 多型的表現手段,估計很多人對其實現機制感興趣。大約一般的教科書就說到這個c 強大機制的時候,就是教大家怎麼用,何時用,而不會去 一下這個虛函式的真正實現細節。當然,因為不同的編譯器廠家,可能對虛函式有自己的實現,呵呵,這就算是虛函式對於編譯器的 多型 了 作為編...

C 虛函式呼叫的反彙編解析

虛函式的呼叫如何能實現其 虛 作為c 多型的表現手段,估計很多人對其實現機制感興趣。大約一般的教科書就說到這個c 強大機制的時候,就是教大家怎麼用,何時用,而不會去 一下這個虛函式的真正實現細節。當然,因為不同的編譯器廠家,可能對虛函式有自己的實現,呵呵,這就算是虛函式對於編譯器的 多型 了 作為編...

C 虛函式呼叫的反彙編解析

c 虛函式呼叫的反彙編解析 虛函式的呼叫如何能實現其 虛 作為c 多型的表現手段,估計很多人對其實現機制感興趣。大約一般的教科書就說到這個c 強大機制的時候,就是教大家怎麼用,何時用,而不會去 一下這個虛函式的真正實現細節。當然,因為不同的編譯器廠家,可能對虛函式有自己的實現,呵呵,這就算是虛函式對...