typedef void *(*func_ptr)(); class A{ public:
// 定义一个父类的三个虚函数 virtual A* get_p() { return this; }; virtual A& get_r() { return *this; }; virtual A get_obj() { cout << "A "<< endl; } }; class B:public A{ public:
//子类只重写了其中的两个 virtual B*get_p() { return this; } virtual B& get_r() { return *this; } }; //所以我们猜测,子类的虚表中的第三个虚函数,是父类的那个get_o()函数的地址。 int main() { A a; B b;
//获取指向虚表的指针 int *v_p = (int *)&a; int *v_q = (int *)&b;
//取出虚表的指针中的值 int *p = (int *)(*v_p); int *q = (int *)(*v_q);
//在我电脑上,一个函数指针的内存 是 一个int的两倍。
int x = sizeof(func_ptr)/sizeof(int); cout << "func ptr is "<< sizeof(func_ptr) <<" int ptr is " << sizeof(int)<< endl; //打印出虚表中的每个函数的地址
for(int i = 0; i < 3; i++) { cout << *(p + x*i) << " "; } cout << endl; for(int i = 0; i < 3; i++) { cout << *(q + x*i) << " "; } cout << endl; return 0; }
看下最终的打印结果:
func ptr is 8 int ptr is 4
4197204 4197218 4197232
4197282 4197296 4197232
可以看到,第一个和第二个不一致,第三个是一样的。