类方法指向其他类的其他方法

时间:2016-10-18 05:23:41

标签: c++ pointers c++14

我想知道是否有可能使一个类的方法指向另一个类的另一个方法:

考虑一下:

// 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;

但我如何才能将方法声明为类?

3 个答案:

答案 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();
}