c++虚函数表详解(一)

来源:互联网 发布:热重分析软件 编辑:程序博客网 时间:2024/05/07 16:33

问题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的虚函数表所在内存的首地址。

原创粉丝点击