#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
请按任意键继续. . .