成员函数指针的结构以及怎么与普通函数指针之间的转换
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章给大家介绍成员函数指针的结构以及怎么与普通函数指针之间的转换,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。通过内存拷贝(memcpy等)可以实现任意指针间的强制转换,但不
千家信息网最后更新 2026年11月03日成员函数指针的结构以及怎么与普通函数指针之间的转换
这篇文章给大家介绍成员函数指针的结构以及怎么与普通函数指针之间的转换,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
通过内存拷贝(memcpy等)可以实现任意指针
间的强制转换,但不能保证可以正常使用。
通过网上查找发现:
函数成员指针其实与普通成员指针不同,它除了包含函数本身地址以外还包含其他信息(例如是否为虚函数等),所以不能简单的理解成员函数指针就是普通指针那样一般占4字节,这个视编译器不同而不同:例如在VS中,普通成员函数指针类似于
struct ptr{
int * addr;
};
而虚函数的结构比较复杂,它是通过this指针加索引的方式来获取函数的真实地址,目前没有完全明白,此不赘述。
这里提获取成员函数真实地址的方法:
1 .普通成员函数
通过观察不难发现结构体的首地址就是addr的首地址,所以成员函数的入口地址其实也就是函数指针的地址,但是C++出于类型安全的考虑不允许他们转换成其他普通指针,如:
class test {public: void print(){}};typedef void (test::*cfun)();typedef void (*fun)();cfun cf = &test::print;fun f= cf; //失败,类型检查memcpy(&f,&cf,sizeof(fun));f(); //成功2. 虚函数
(1)通过虚函数表获取
class test{public: virtual void print(){}};typedef void (test::*cfun)();typedef void (*fun)();test t;int **vptr = (int**)(&t); //vptr[0]获取虚函数表地址cfun f = vptr[0][0]; //后面那个零时虚函数在虚函数表中的索引,表示第一个虚函数f();((fun) vptr[0][0])();通常不能用&test::print获取虚函数地址,即使获取地址也是一个中间值或者总是返回0x1。
3. 通用的指针转换函数
templateR convert(T t){ long addr = 0; memcpy(&addr,&t,sizeof(long)); return (R)(addr);}
但不能保证转换的有效性。
关于成员函数指针的结构以及怎么与普通函数指针之间的转换就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
函数
指针
地址
成员
普通
结构
不同
之间
内容
就是
更多
类型
保证
帮助
不错
复杂
有效
安全
成功
也就是
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网是第几次科技革命的成果
上海卓越科技互联网
科技互联网公司装修
互联网下的科技发展
高科技与互联网
万易互联网科技有限公司
智慧科技互联网
互联网科技缩写
互联网科技公司有哪些
成都狮子座互联网科技
互联网科技寓意
重庆互联网医院沙龙医盟信息科技
互联网科技扶贫时间
畅思互联网科技
华夏恒生互联网科技013171
区块链结合互联网科技
上海乐五互联网科技有限公司
西安有哪些互联网高科技企业
长沙渺峰互联网科技有限公司
唐山双旺合互联网科技产业园
互联网科技公司起名
互联网科技英文
哈尔滨秒房互联网科技有限公司
北京三清互联网科技
天津腾达互联网科技有限公司
互联网金融科技名词解释
科技赋能视角下互联网保险发展
江苏互联网智能科技产品出厂价
互联网科技新闻
云南互联网科技学费