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
- C++中程序化操作虚函数列表实验
- C#--C#中常用函数列表
- C 语言中函数可变参数列表
- C中字符串操作函数
- 程序化
- mysql操作函数列表
- c#.net函数列表
- c#.net函数列表
- c#.net函数列表
- c#.net函数列表
- c#.net函数列表
- c#.net函数列表
- c#.net函数列表
- C#.NET 函数列表
- c#.net函数列表
- c#.net函数列表
- c#.net函数列表
- c#.net函数列表
- C++笔记
- pthread
- 论文书写---格式控制
- Android之Activity应用小例子
- BitBlt StretchBlt TransparentBlt
- C++中程序化操作虚函数列表实验
- android 如何设置checkbox、edittext点击前后不同样式
- SSH框架总结(框架分析+环境搭建+实例源码下载)--这个很值得一读~!
- 互联网通信应用定义
- 【c++】PAT (Advanced Level)1023. Have Fun with Numbers (20)
- 每一个Javascript程序员都应该了解的浮点知识
- 日期结构体
- 成为一个 PHP 专家:缺失的环节
- VisionMobile:2014年Q1移动开发者经济报告(五)2.2、地区前景