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