成员函数指针的结构以及怎么与普通函数指针之间的转换
发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,这篇文章给大家介绍成员函数指针的结构以及怎么与普通函数指针之间的转换,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。通过内存拷贝(memcpy等)可以实现任意指针间的强制转换,但不
千家信息网最后更新 2025年02月05日成员函数指针的结构以及怎么与普通函数指针之间的转换
这篇文章给大家介绍成员函数指针的结构以及怎么与普通函数指针之间的转换,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
通过内存拷贝(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安全错误
数据库的锁怎样保障安全
南京环保软件开发销售方法
mcgo服务器
tplink软件开发招聘人数
数据库图标是啥样测
特斯拉UKG服务器
英雄联盟服务器网址
脑叶公司如何回滚数据库
广联达企业数据库模拟题答案
csmar数据库可以校外登录吗
怎么利用数据库
中芯国际华为服务器
实况足球巴蒂斯图塔巅峰数据库
软件开发所需要的软件是什么
网络安全公益宣传视频
山西触摸屏软件开发公司
网络安全职责追究
华为网络技术工程师很累
开票软件连接不了服务器
兴化市安迪网络技术工作室
香肠派对一直服务器中断怎么办
大庆市领航软件开发
天津点石网络技术有限公司
nature数据库网址
php向服务器发送请求
紫通科技杯网络安全答案
美国服务器url地址
网络安全公益宣传视频
数据库目录 共享和安全性
滴滴app服务器数据错误
班会网络安全为人民