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();
}
}