c++ - 更改C++中成员函数的地址

标签 c++ function-pointers pointer-to-member dll-injection

在 C++ 中,我可以通过获取成员函数的地址轻松创建函数指针。但是,是否可以更改该本地函数的地址?

即假设我在同一个类中有 funcA() 和 funcB(),定义不同。我希望将 funcA() 的地址更改为 funcB() 的地址,这样在运行时调用 funcA() 实际上会调用 funcB()。我知道这很丑陋,但我需要这样做,谢谢!

编辑------------

我正在尝试做的事情的背景:

我希望为现有代码库实现单元测试,我的所有模块都继承的基类中的一些方法是非虚拟的。我不允许编辑任何生产代码。我可以摆弄构建过程并在基类中替换相关方法设置为 virtual 但我想我宁愿使用这样的 hack(我认为这是可能的)。

此外,出于技术好奇心,我对这个主题很感兴趣,因为通过尝试破解这个问题的过程,我学到了很多关于代码生成和函数查找等事情在引擎盖,我刚读完大学二年级,还没有机会在学校学习。我不确定我是否会在学校教过这样的东西,因为我正在学习计算机工程类(class)而不是 CS。

回到主题 方法 funcA() 和 funcB() 确实具有相同的签名,所以问题是我只能使用 & 运算符获取函数的地址?我不能更改函数的地址,或者在不损坏部分内存的情况下换出该地址的内容,这样说是否正确?如果将函数导出到 dll,那么 DLL 注入(inject)是否是解决此类情况的好方法?

最佳答案

没有。函数被编译成可执行文件,并且它们的地址在程序的整个生命周期中都是固定的。

最接近的是虚函数。请举例说明您要实现的目标,我保证有更好的方法。

关于c++ - 更改C++中成员函数的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2367180/

相关文章:

c++ - 填充对 vector

c++ - 函数指针语法

c++ - 如何获取重载成员函数的地址?

c++ - 带括号的成员函数的地址错误

C 将字符串映射到函数

c++ - 如何通过指向成员数据的指针调用成员函数?

c++ - boost::split 在字符串的开头和结尾留下空标记——这是期望的行为吗?

c++ - 将头文件包含到头文件中而不将其内容暴露给包含程序

c++ - 将指针传递给构造函数时没有调用错误的匹配函数

c - 在C中使用函数指针有效吗?