首页 > 其他 > 详细

研究一下函数的虚表

时间:2019-03-26 16:28:16      阅读:112      评论:0      收藏:0      [点我收藏+]
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

 

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

 

 

研究一下函数的虚表

原文:https://www.cnblogs.com/buddho/p/10600854.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!