問題1: 一個類對應一個虛函數表還是一個對象對應一個虛函數表?
#include <iostream>#include <tchar.h>using namespace std;class Human{public:virtual void Print(){cout << _T("Human::Print") << endl;}};int _tmain(int argc, TCHAR argv[], TCHAR envp[]){Human Modi;Human Negi;int* pModi = (int*)(&Modi);int* pNegi = (int*)(&Negi);int* AddrOfModiVTable = (int*)(*pModi);int* AddrOfNegiVTable = (int*)(*pNegi);cout << _T("Modi的虛函數表所在記憶體的首地址:") << AddrOfModiVTable << endl;cout << _T("Negi的虛函數表所在記憶體的首地址:") << AddrOfNegiVTable << endl;return 0;}
運行結果如下:
得出問題一的答案:一個類對應一個虛函數表。
int* pModi = (int*)(&Modi); 詳細講解:
&Modi :取得Human類對象Modi所在記憶體的首地址A。
(int*)&Modi :首地址A對應的指標類型是Human*,該語句將Human*強制轉換成int*
此時pModi是一個int類型的指標,指向的記憶體位址是Modi所在的記憶體的首地址A,指向的記憶體塊的大小是四個位元組(假設int類型佔用4個位元組的記憶體空間)。
int* AddrOfModiVTable = (int*)(*pModi); 詳細講解:
*pModi :取出Modi所在的記憶體的前四個位元組的空間所儲存的內容B(B此時是一個int類型的數)。
(int*)(*pModi) :將內容B的類型由int強制轉換成int*
此時AddrOfModiVTable的值就是Modi所在的記憶體的前四個位元組的空間所儲存的內容,並且該內容的類型是int*
而我們知道,Modi所在的內容的前四個位元組的空間所儲存的內容就是Modi的虛函數表所在記憶體的首地址。