C++中程序化操作虚函数列表实验

来源:互联网 发布:阿里云实例重装系统 编辑:程序博客网 时间:2024/06/02 04:09
#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
请按任意键继续. . .

2 0
原创粉丝点击