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

 

可以看到,第一个和第二个不一致,第三个是一样的。

 

 

posted on 2019-03-26 16:13  newbird2017  阅读(115)  评论(0编辑  收藏  举报