关于虚函数地址的问题

来源:互联网 发布:推理小说流行知乎 编辑:程序博客网 时间:2024/05/02 08:48

看到别人的文章,知道虚函数列表存在于虚函数所在类的实例对象里,并且地址是第一个。所以可以通过实例对象找到虚函数列表,从而找到虚函数列表中的虚函数。

#include <iostream>using namespace std;class Base{public:virtual void f(){cout << "Base::f()" <<endl;}virtual void g() {cout << "Base::g()" <<endl;}virtual void h() {cout << "Base::h()" <<endl;}};void main(){typedef  void (* Fuc)();Fuc pFun;Base b;cout << "虚函数表的地址"<<(int*)&b <<endl;cout << "第一个虚函数的地址是:" << (int*)*(int*)&b <<endl;cout << " 取出该地址里的内容以int指针(int*)型输出:" << (int*)*(int*)*(int*)&b <<endl;cout << " 取出该地址里的内容以函数指针型(Fuc)输出:" << endl;((Fuc)*(int*)*(int*)&b)();/*********************************************************************** 第二个函数怎么取,应该是指向该虚函数表的指针+1.指向该函数的虚函数表的指针 (int*)*(int*)&b第二个是 (int*)*(int*)&b+1.取出内容  *((int*)*(int*)&b+1) 转为函数指针型(Fuc)*((int*)*(int*)&b+1)***********************************************************************/cout << "第二个虚函数是:" <<endl;pFun=(Fuc)*((int*)*(int*)(&b)+1);pFun();}


如图所示

 

 

分析:

0 0
原创粉丝点击