#include<iostream>
#include<string>
using namespace std;
class base {
public :
int ma;
private:
virtual int fun1()
{
cout<<"base: fun1"<<endl;
return 0;
}
virtual void fun2()
{
cout<<"base: fun2"<<endl;
}
virtual void fun3()
{
cout<<"base: fun3"<<endl;
}
};
class A : public base
{
public :
int mb;
private:
int fun1()
{
cout<<"A: fun1"<<endl;
return 1;
}
void fun2()
{
cout<<"A: fun2()"<<endl;
}
};
//获取一个指向指针的指针中所存储的指针并转换成void*类型
void * getP(void * p )
{
unsigned long * p1 = (unsigned long *)p;
return (void *)(*p1);
}
//定义函数指针类型
typedef int (* fun1)();
typedef void (* fun)();
//获取虚函数表中第n个函数的方法
void * GetPfun(base *obj , unsigned n) //obj指针就相当于是VPTR指针
{
//首先获取虚函数数组的首地址
void * pVtable = getP(obj);
//注意:人为的去操作一个指针(即去平移一个指针时),其移动的最小单位只能是一字节为单位,因为C++中最小的数据类型就巧合只占一个字节。
//把pVtable转换为unsig char * 类型,即以字节为单位去操作它
unsigned char * cp = (unsigned char *)pVtable;
//找到第n个虚函数的首地址指针
cp += sizeof(void *) * (n-1);
//将第n个虚函数的首地址转换为void * 类型,以便最后可以转换回函数指针。
void * pf = getP(cp);
return pf;
}
int main()
{
base * b = new A;
fun1 f1 = (fun1)GetPfun(b,1);//得到第一个虚函数指针
(*f1)();//调用第一个虚函数
fun f2 = (fun)GetPfun(b,2);
(*f2)();//调用第二个虚函数
fun f3 = (fun)GetPfun(b,3);
(*f3)();//调用第二个虚函数
delete b;
return 0;
}
分别输出:
A: fun1
A: fun2()
base: fun3
请按任意键继续. . .