成员函数指针的结构以及怎么与普通函数指针之间的转换
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,这篇文章给大家介绍成员函数指针的结构以及怎么与普通函数指针之间的转换,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。通过内存拷贝(memcpy等)可以实现任意指针间的强制转换,但不
千家信息网最后更新 2025年11月08日成员函数指针的结构以及怎么与普通函数指针之间的转换
这篇文章给大家介绍成员函数指针的结构以及怎么与普通函数指针之间的转换,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
通过内存拷贝(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安全错误
数据库的锁怎样保障安全
淮南网络安全和信息化委员会
在数据库中v代表啥意思
网络安全助力强军兴军板报
大合网络技术开发有限公司
命令行启动数据库文件系统
深圳市海云安网络安全技术
银行网络如何保障网络安全
未成年人网络安全教育记录
python爬取一言数据库
数据库操作代码
数据库查询并给字段名字
班会串词网络安全
学校的网络安全现状
征集网络安全广告
宿州企业软件开发公司
茂东网络技术武汉有限公司
为什么网络安全是国家战略
网络安全是一个 的安全技术手段
安徽信功互联网科技有限公司
数据库插入数据自动排序
电子公告eb和数据库db
软件开发的知识产品归属
正宗网络安全概念股
sql对数据库进行扩展
监狱网络安全管理干嘛
高速移动网络技术的利与弊
web网页使用数据库名称是什么
一个服务器可以接多少网线
远程处方软件开发商
社会安全 网络安全