改变在C成员函数的地址++
-
23-09-2019 - |
题
在C ++中,我可以很容易地通过取一个成员函数的地址创建一个函数指针。然而,是否有可能改变本地函数的地址?
即。说我在同一个班级,不同的定义有FuncA的()和funcB()。我期待)改变FuncA的(地址到funcB(的),使得在运行时调用FuncA的()中funcB的调用实际结果()。我知道这是丑陋的,但我必须这样做,谢谢!
修改---------- 强>
这是我想要做的背景:
我希望能实现单元测试用于现有代码的基础上,一些在其中所有的我的模块从继承的基类的方法都是非虚拟。我不能编辑任何生产代码。我可以在与设定为虚拟的相关方法的基类的生成过程和替代拨弄,但我认为我宁愿使用这样一个黑客(我认为是可能的)。
另外,我通过努力破解解决这个问题,我学习了不少关于工艺感兴趣的话题进行技术好奇心,如何的东西,如下面的代码生成和功能查找工作油烟机,我已经没有机会在其大学刚打完第二年学校学习。我不知道,以我永远教这样的事情在学校里,我在计算机工程课程,而不是CS来的。
返回对主题强> 该方法FuncA的()和funcB()确实具有相同的签名,所以问题是,我可以使用与经营者只能获得一个函数的地址?我会正确地说,我不能没有损坏的内存部分更改功能,或换出在该地址内容的地址?将DLL注入是这样的情况一个很好的方法,如果功能远销一个dll?
解决方案
没有。功能被编译成可执行,和它们的地址是固定的整个程序的寿命。
最接近的事是虚函数。给我们的,你要完成什么样的例子,我保证有一个更好的办法。
其他提示
它不能做你描述的方式。更改静态绑定调用目标的唯一方法是通过修改程序的实际可执行代码。 C ++语言没有特征,可以实现这一目标。
如果你想函数调用在运行时解决您必须要么使用显式间接调用(通过函数指针调用),或使用的语言功能是基于运行时调用分辨率(如虚拟函数),或您可以使用具有良好的老if
或switch
平原分支。这是你的情况更合适要看您的具体问题。
从技术上讲,可能通过修改类型的虚函数表虚函数是可能的,但你肯定不能在不违反标准(导致未定义行为)做到这一点,它需要怎样的具体编译器处理虚函数表的知识。
有关的其它功能是不可能的,因为的函数的地址被直接写入的程序代码,其通常是在只读存储区中。
你想要的是一个指向一个功能,你可以将它指向FuncA的或FuncB假设它们具有相同的签名。
我相当确信这是纯C ++不可能。 C ++不是动态语言。
您不能做你想直接做什么。但是,您也可以达到类似的结果与一些稍有不同的标准,使用的东西你已经熟悉了 - 函数指针。考虑:
// This type could be whatever you need, including a member function pointer type.
typedef void (*FunctionPointer)();
struct T {
FunctionPointer Function;
};
现在你可以设置在任何给定Function
实例T
成员,并调用它。这是最接近你可以得到合理的,而且我相信,既然你已经知道函数指针的你已经意识到了这个解决方案。
你为什么不跟你正在试图解决这个问题的一个更为完整的描述编辑你的问题?因为它的立场听起来真是你正在试图做一些可怕的事情。
其简单!
有关
在运行时调用FuncA的行()实际上导致对funcB()的调用。
类似于以下写funcA()
:
int funcA( int a, int b) {
return funcB( a, b );
}
: - )