使用 union获取成员函数的地址

Python爬虫实战:5分钟搞定慢慢买历史价格查询(附完整代码) 本文提供了一份Python爬虫实战指南,教你如何快速编写脚本自动查询慢慢买网站的商品历史价格。文章详细拆解了环境准备、接口分析、核心代码实现及常见问题应对,并附有完整代码,帮助读者将爬虫技术应用于日常比价,实现高效购物决策。 阅读详情
如题,如果我们想在C++上获取成员函数的地址(这里指的是非静态的成员函数),喜闻乐见地发现,原来&Class::Funtion是不行的。这里的环境是VS2015 ,于是上网找一下资料,发现有人利用了unio + 成员函数指针达到了获取成员函数地址,先上代码。
#include "stdafx.h"
#include "TestB.h"
#include <iostream>
using namespace std;
typedef void(*funcp) ();
typedef void (TestB::*func)();
union {
	void *pv;
	void(TestB::*pfn)();
} u;
void Show()
{
	cout << "Hello this is show" << endl;
}

int main()
{
	TestB testb;
	u.pfn = &TestB::show;
	funcp* re = reinterpret_cast<funcp*>(&u.pfn);
	(*re)();
	//cout << re << endl;
    return 0;
}

这里的pv是我们可以操作的,而TestB::*pfn是获取目标函数地址,然后利用reinterpret_cast,强制转换达到了目的。这里注意的是,如果目标函数里存在成员变量,会以未定义的形式出现,这里指的是非静态的。到这,我的目的基本达到,后续继续去玩更好玩的代码。

#include "stdafx.h"
#include "TestB.h"
#include "TestC.h"
#include <iostream>
using namespace std;
typedef void(*funcp) ();
typedef void (TestB::*func)();
typedef void (TestC::*funcd)();
union {
	void *pv;
	void(TestB::*pfn)();
} u;
void Show()
{
	cout << "Hello this is show" << endl;
}

int main()
{
	TestB testb;
	TestC  testc;
	TestC* testd = &testc;
	u.pfn = &TestB::show;
	funcd* re = reinterpret_cast<funcd*>(&u.pfn);
	funcd red = &TestC::show;
	(testd->**re)();
	//cout << re << endl;
    return 0;
}
上面代码里,我将c类对象的一个变量应用到B上,这里调用了B的方法,用了C的变量。
银河麒麟桌面系统 必会操作 | 加装双系统(麒麟桌面系统+Windows系统)的详细方法(含常见故障和解决方法) 装好麒麟桌面操作系统的电脑上、再加装Windows 操作系统的详细方法;和在已经装好Windows系统的电脑上、再加装麒麟桌面操作系统的详细方法;含加装双系统过程中常见问题的解决方法。 阅读详情

相关推荐

Abaqus传热分析HETVAL和USDFLD子程序联合

Hetval子程序常用于定义内部热源,该子程序可以定义材料内部的生热量(如相变、高分子结晶生热),并且能够调用state variable 状态变量,可以与USDFLD子程序联合使用。HETVAL子程序用于计算传热系数并在单元上定义,USDFLD子程序用于在每个时间布更新温度场。

qq_41900477的博客 2660

union关键字和取类成员函数地址的方法

union关键字 union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。例子如下: union StateMachine {     char character;     int number;     char *str;

Jedihy的博客 1293

Zemax中场曲与畸变图的深度解析与应用场景对比

本文深度解析了Zemax中场曲/畸变图与网格畸变图的核心原理、计算逻辑与适用场景。通过对比常规成像镜头、扫描镜头、鱼眼镜头及变形宽银幕镜头等实际案例,详细阐述了如何根据系统对称性、视场角及核心需求选择正确的分析工具与畸变评价标准,为光学设计中的畸变诊断与优化提供清晰指导。

sand8的博客 482

C++取成员函数地址方法

转载:http://www.cnblogs.com/nbsofer/p/get_member_function_address_cpp.html 一、通过静态转换 template dst_type pointer_cast(src_type src) { return *static_cast(static_cast(&src)); } 二、通过联合体的共享存储机制 templ

u012140512的博客 3509

手把手教你用光耦搭建安全隔离电路:从洗衣机控制板到PLC输入模块实战

本文通过洗衣机控制板驱动高压电机和PLC输入模块采集现场信号两个实战场景,手把手教你使用光耦搭建安全隔离电路。文章详细解析了电路架构、关键器件选型、参数计算、仿真验证及PCB布局避坑技巧,并对比了光耦与数字隔离器的适用场景,帮助电子工程师掌握这门保障系统稳定与安全的必备技能。

h6j7k8l9p0的博客 462

告别玄学调参:手把手教你用20元件模型搞定GaN HEMT高频仿真(附S参数提取避坑指南)

本文详细介绍了如何使用20元件模型优化GaN HEMT高频仿真,解决传统16元件模型在10GHz以上频段的误差问题。通过S参数提取避坑指南和实战案例,帮助工程师精准建模分布式电极效应和寄生反馈路径,提升射频电路设计效率。

weixin_42523693的博客 441

总结C++中取成员函数地址的几种方法

  这里, 我整理了4种C++中取成员函数地址的方法, 第1,2,4种整理于网上的方法, 第3种cdecl_cast是我自己想到的.  其中, 第4种(汇编)的方法不能在VC6上编译通过. 推荐使用第1,2种方法(pointer_cast 和 union_cast).  至于:为什么要取成员函数的地址? 因为可以通过一定的手段 让成员函数作为回调函数, 而不再使用全局的静态函数.  天气热,话不多...

weixin_34081595的博客 672

从零开始学DAG:用dagitty软件快速构建因果图的5个步骤

本文为初学者提供了使用dagitty软件快速构建因果图的5个实用步骤。通过一个公共卫生研究实例,详细演示了如何从定义核心变量开始,逐步引入混杂、中介和碰撞变量,最终利用dagitty的自动分析功能识别最小充分调整集,从而科学指导研究设计与统计分析,有效提升因果推断的严谨性。

ii567的博客 799

sql union()函数

union 取的并集中,sql查询返回的结果,必须拥有相同的列,列的类型也必须相同。union 函数用于对两个或者多个sql查询结果进行取并集操作。对两个或者多个 sql查询结果取并集操作,并会过滤掉重复数据。对两个或者多个 sql查询结果取并集操作,不会过滤掉重复数据。有两张班级表class1和class2,查询两个班级中的得分,取并集。

欢迎一起学习交流 2775

硬核反坑!YOLOv5训练避坑指南:根治梯度消失、不收敛、检测漏框三大核心问题(附实战代码+调优清单)

数据是基础,超参数是关键,模型是工具,训练策略是保障。梯度消失、不收敛、检测漏框这三大问题,本质上都是“数据-模型-训练”不匹配的结果。梯度消失/爆炸:优先调整学习率策略+梯度裁剪,其次优化模型结构;训练不收敛:优先清洗数据集,其次调优超参数,最后检查配置文件;检测漏框:优先重新聚类锚框,其次增强浅层特征,最后调整推理参数。YOLOv5训练的最高境界,不是调参,而是让数据、模型、训练策略三者完美匹配。按本文的方法反坑,你的YOLOv5训练一定能一次成功!🚀。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 233

union和union all函数的使用

union和union all函数的使用 在开发中,有些数据的存储可能涉及到分库分表,查询的时候,可能需要查询所有的分表,这个时候,就需要用到UNION或者UNION ALL。 1.union的使用: UNION操作符用于合并两个或多个SELECT语句的结果集。 使用注意事项: UNION内部的SELECT语句必须拥有相同数量的列,列也必须拥有相似的数据类型。 每条SELECT语句中列的顺序必须相同。 SELECT ID,name FROM emp1 UNION SELECT ID,name

boos_zhao的博客 2万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【C++】取成员函数地址的几种方法

这里, 我整理了4种C++中取成员函数地址的方法, 第1,2,4种整理于网上的方法, 第3种cdecl_cast是我自己想到的.其中, 第4种(汇编)的方法不能在VC6上编译通过. 推荐使用第1,2种方法(pointer_cast 和 union_cast).   至于 其实, 我并不明白这个方法为什么成功了, 而且要使用两个static_cast, 一个不行. 而且函数里面使用的&src, 但我传入参数的时候还需要以&ClassName::MemFunc的形式, 不然就是错误的, 为什么? 方法3: c

qq_43331089的博客 397

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

输出成员函数地址小结

#include <iostream> using namespace std; class Ctest { public: static void statFunc() { cout << "statFunc" << endl; } void ...

chouchijiao8952的博客 113

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

获取成员函数地址3种方法

class IntTT { public: virtual void TV(){printf(__FUNCTION__"\n");}; }; typedef void (IntTT::*Func)(); union { long long addr; Func f; }ut; void main() { ut.f = &IntTT::TV; void* p2 = (void*)&

heartrude的专栏 1591

C++中取成员函数地址的几种方法

获取成员函数的几种方法

zeng675147的博客 2401

C++是否可以使用.获取union、struct中的成员变量的地址

C++可以使用.获取union、struct中的成员变量的地址。

y_m_h的博客 346

sql注入中的union联合查询,union select 1,2,3

sql注入中的union联合查询,union select 1,2,3

m0_51756263的博客 1万+

oracle的 union,Oracle Union运算符

在本教程中,您将学习如何使用Oracle UNION运算符来组合由两个或多个查询返回的结果集。Oracle UNION运算符简介UNION运算符是一个集合运算符,它将两个或多个SELECT语句的结果集组合到一个结果集中。以下说明了组合两个查询的结果集的UNION运算符的语法:SELECTcolumn_list_1FROMT1UNIONSELECTcolumn_list_1FROMT2;在此声明中,...

weixin_39901439的博客 1053

MySQL UNION 操作符

UNION。

wangjinjin180的博客 1171

MySQL中UNION和UNION ALL的使用

在数据库中,UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。 MySQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如: select * from gc_dfys

1万+

C语言中的union使用方法

union共用声明和共用一变量定义: “联合”是一种特殊的类,也是一种构造类型的数据结构。在一个“联合”内能够定义多种不同的数据类型。 一个被说明为该“联合”类型的变量中。同意装入该“联合”所定义的不论什么一种数据。这些数据共享同一段内存, 以达到节省空间的目的(另一个节省空间的类型:位域)。 这是一个很特殊的地方,也是联合的特征。 另外,同struct一样,联合默认訪问权限...

weixin_34268753的博客 2605

c++中union的使用

union即为联合,它是一种特殊的类。通过关键字union进行定义,一个union可以有多个数据成员。 在任意时刻,联合中只能有一个数据成员可以有值。当给联合中某个成员赋值之后,该联合中的其它成员就变成未定义状态了。 在C/C++程序的编写中,当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体;当多种类型,多个对象,多个事物只取其一时(我们姑且通俗地称其为“n 选1”),我们也可以使用联合体来发挥其长处。 union主要是共享内存,分配内存以其最大的结构或对象为大小,即sizeof最大的。

qq_45611002的博客 1万+
上一篇: Linux 简议简单修改配置解决高频率的服务器写操作
下一篇: 利用valgrind 查找内存泄漏
WaitForDone
博客等级 码龄10年 8粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值