c++虛函數表詳解(一)

來源:互聯網
上載者:User

問題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的虛函數表所在記憶體的首地址。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.