我想知道是否有可能使一个类的方法指向另一个类的另一个方法:
考虑一下:
// Class Foo:
class Foo
{
static int GetA(int a);
static int GetB(int b);
};
int Foo::GetA(int a)
{
return a * 2;
}
int Foo::GetB(int b)
{
return a * 4;
}
// Hooking class methods:
class HookFoo
{
static int HookGetA(int);
static int HookGetB(int);
};
int(HookFoo::*HookGetA)(int) = (int(HookFoo::*)(int))0x0; // (0x0 Memory address) or for example: &Foo::GetA;
int(HookFoo::*HookGetB)(int) = (int(HookFoo::*)(int))0x0; // (0x0 Memory address) or for example: &Foo::GetA;
我知道可以做一些像:
int(*NewHook)(int) = &Foo::GetA;
但我如何才能将方法声明为类?
答案 0 :(得分:2)
这或多或少是你想要达到的目标(最小的,工作的例子):
class Foo
{
public:
static int GetA(int a);
static int GetB(int b);
};
int Foo::GetA(int a)
{
return a * 2;
}
int Foo::GetB(int b)
{
return b * 4;
}
class HookFoo
{
public:
using FuncType = int(*)(int);
static FuncType HookGetA;
static FuncType HookGetB;
};
// Initialized with Foo::GetA
HookFoo::FuncType HookFoo::HookGetA = &Foo::GetA;
// nullptr'ed
HookFoo::FuncType HookFoo::HookGetB = nullptr;
int main() {
HookFoo::HookGetA(0);
}
对于Foo
中的方法是静态的,您可以使用简单的函数指针类型来引用它们。在这种情况下,您不必使用(并且不能实际使用)成员函数指针
使用声明有助于获得更易读的代码
正确初始化 hooks 后,您可以调用它们(因此指向函数),如main
中所示。
我为您的方法添加了几个可见性说明符,数据成员都是私有的。
答案 1 :(得分:0)
如果需要挂钩特定地址的函数,请使用函数指针。你不能重新分配这样的功能
// typedef your function pointers, it makes the syntax a lot easier
typedef int(*FHook)(int);
class HookFoo
{
static FHook HookGetA;
static FHook HookGetB;
};
// assign to address
FHook HookFoo::HookGetA = (FHook)0x1234;
FHook HookFoo::HookGetB = (FHook)0x5678;
当然,确保地址正确无误。
显式函数指针类型如下:
class HookFoo
{
static int (*HookGetA)(int);
static int (*HookGetB)(int);
};
int (*HookFoo::HookGetA)(int) = (int(*)(int))0x1234;
int (*HookFoo::HookGetB)(int) = (int(*)(int))0x5678;
答案 2 :(得分:0)
您可以使用功能指针 例如:
class A {
public:
static void say_hello() { cout << "Hello\n"; }
};
class B {
public:
static void(*hook)();
};
void(*B::hook)() = A::say_hello;
int main()
{
B::hook();
}