C++虚函数表

在类中,如果用virtual定义了一个虚函数,那么C++会在内存该类的内存中的第一个区域开辟一个执行虚函数表的指针,存放着虚函数的地址。
结构如下图所示
虚函数表结构

#include <iostream>  
using namespace std;  
#define pri() cout<<__func__<<" "<<__LINE__<<endl  
typedef void (*func)(void);  
class Base{  
private:  
	int a;  
	int b;  
public:  
	Base(int a , int b):a(a),b(b){}  
	virtual void getA(){pri();};  
	virtual void getB(){pri();};  
};  
int main(){  
	Base obj(122,22210);  
	/*  
	这里注意,在写这段代码的时候一直出现问题,因为这是64位系统,其中虚函数表  
	所执行的地址占8字节,最开始使用的是(int *)+1,一直访问不到;因为这里的  
	+1是向后移动4个字节,并没有移出指向虚函数表的地址,所以一直出错,然后改成  
	了long*后才成功,我一直以为(int *)强转后偏移都是8位偏移,通过这个例子  
	才发现是按照类型偏移,这里用(long*)正确是因为在64位系统中long占8位所以  
	偏移+1才达到变量a的地址  
	*/  
	cout<<"a:"<< *(int *)((short *)&obj+4)<<endl;  //12
	cout<<"a:"<< *(int *)((char *)&obj+8)<<endl;   //12
	cout<<"a:"<< *(int *)((int *)&obj+2)<<endl;    //12
	cout<<"a:"<< *(int *)((long *)&obj+2)<<endl;   //12
	cout<<"b:"<< *(int *)((long *)&obj+3)<<endl;   //22210
	// func p = (func)(* (int*) (*((int*)&obj))+1);  
	// p();  
	cout<<sizeof(obj)<<endl;  
	// 这句结果是16,因为除了两个int一共类型占用8字节外,还有一个指向虚函数表的指针,他是一个指针,在64为系统中占用8个字节,所以结果为16  
	// p();  
	  
}

}