看到别人的文章,知道虚函数列表存在于虚函数所在类的实例对象里,并且地址是第一个。所以可以通过实例对象找到虚函数列表,从而找到虚函数列表中的虚函数。
#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();
}
如图所示
分析: