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

更改C+中成员函数的地址+; 在C++中,通过使用成员函数的地址,可以轻松地创建函数指针。但是,是否可以更改该本地函数的地址,c++,function-pointers,member-function-pointers,dll-injection,C++,Function Pointers,Member Function Pointers,Dll Injection,例如,假设funcA()和funcB()在同一个类中,定义不同。我希望将funcA()的地址更改为funcB(),这样在运行时调用funcA()实际上会导致调用funcB()。我知道这很难看,但我需要这样做,谢谢 编辑------------ 关于我正在尝试做的事情的背景: 我希望为现有的代码库实现单元测试,基类中的一些方法是非虚拟的,我的所有模块都是从这些方法继承的。我不允许编辑任何生产代码。我可以摆弄构建过程,用设置为virtual的相关方法替换基类,但我认为我更愿意使用这样的hack(我认

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

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

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

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

另外,出于对技术的好奇,我对这个话题感兴趣,因为通过尝试破解这个问题的过程,我学到了很多东西,比如代码生成和函数查找是如何在引擎盖下工作的,而我刚刚完成大学二年级,在学校里还没有机会学习这些东西。我不确定我在学校里是否会被教授这样的东西,因为我在计算机工程专业而不是计算机科学专业

回到话题上
方法funcA()和funcB()确实具有相同的签名,所以问题是我只能使用&运算符获取函数的地址?如果我说我不能更改函数的地址,或者在不损坏部分内存的情况下交换该地址的内容,那么我的说法是否正确?如果函数被导出到一个DLL?

< P>,DLL注入会是一个很好的方法吗?我确信在纯C++中是不可能的。C++不是动态语言。< / P> < P>我确信在C++中是不可能的。C++不是动态语言。< / P > < P>它不能按你描述的方式来做。更改静态绑定调用的目标的唯一方法是修改程序的实际可执行代码。C++语言没有任何功能可以完成。
如果希望在运行时解析函数调用,则必须使用显式间接调用(通过函数指针进行调用),或者使用基于运行时调用解析的语言功能(如虚拟函数),或者可以使用普通分支和良好的旧
If
开关
。在你的情况下,哪一个更合适取决于你的具体问题。

这不能用你描述的方式来完成。更改静态绑定调用的目标的唯一方法是修改程序的实际可执行代码。C++语言没有任何功能可以完成。
如果希望在运行时解析函数调用,则必须使用显式间接调用(通过函数指针进行调用),或者使用基于运行时调用解析的语言功能(如虚拟函数),或者可以使用普通分支和良好的旧
If
开关
。在您的情况下,哪个更合适取决于您的具体问题。

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


最接近的是虚拟函数。给我们一个你想要完成的例子,我保证有更好的方法。

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


最接近的是虚拟函数。给我们一个你想要实现的例子,我保证有更好的方法。

从技术上讲,通过修改类型的vtable,虚拟函数可能是可行的,但你肯定不能在不违反标准的情况下实现(导致未定义的行为)它需要了解特定编译器如何处理vtables


对于其他函数,这是不可能的,因为函数的地址直接写入程序代码,而程序代码通常位于只读内存区域。

从技术上讲,通过修改类型的vtable,虚拟函数可能是可能的,但在不违反标准的情况下,您肯定无法做到这一点(导致未定义的行为)并且需要了解特定编译器如何处理vtables


对于其他函数,这是不可能的,因为函数的地址直接写入程序代码,而程序代码通常位于只读内存区域。

您需要的是指向函数的指针,您可以将其指向FuncA或FuncB,前提是它们具有相同的签名。

您需要的是指向函数的指针,您可以假设FuncA或FuncB具有相同的签名,则将其指向FuncA或FuncB。

您无法直接执行您想要执行的操作。但是,您可以使用您已经熟悉的函数指针,使用一些稍有不同的标准来实现类似的结果。请考虑:

// This type could be whatever you need, including a member function pointer type.
typedef void (*FunctionPointer)();

struct T {
   FunctionPointer Function;
};
现在,您可以在任何给定的
T
实例上设置
函数
成员,并调用它。这是您可以合理获得的最接近的结果,我认为,既然您已经知道函数指针,那么您已经知道这个解决方案


你为什么不编辑你的问题,对你试图解决的问题进行更完整的描述呢?从目前的情况看,这听起来真的像是你在试图做一些可怕的事情。

你不能直接做你想做的事情。但是,你可以用一些稍微不同的标准,使用你已经熟悉的东西,获得类似的结果带--函数指针的iliar。请考虑:

// This type could be whatever you need, including a member function pointer type.
typedef void (*FunctionPointer)();

struct T {
   FunctionPointer Function;
};
现在,您可以在任何给定的
T
实例上设置
函数
成员,并调用它