如何将类方法的地址转换为(void*)

Jos*_*phH 1 c++ architecture x86 gcc visual-c++

class Foo{
public:
    void Bar();
}
Run Code Online (Sandbox Code Playgroud)

它不必是安全的,我不关心this指针.我只需要获取位于x86内存中的Bar函数的地址

void *address = (void *)&(Foo::Bar) 不起作用.

void *address = (void *)(&Foo::Bar) 不起作用.

void *address = (void *)Foo::Bar 不起作用.

编辑:让我澄清一下.即使理论上将函数指针强制转换为对象也是非法的,因为函数可能位于另一个存储空间中,实际上它们是相同的.正如我前面提到的,它既不安全,也不合法.我在问题中添加了x86标签.它只需要在x86架构上使用gcc和MSVC.

Ker*_* SB 9

你没有,你不能.指针到成员函数不是指针(对象,即它们不适T*用于任何类型T).它们不一定,甚至实际上也不适合void*.

你唯一知道的void*是它足以容纳任何对象指针.而已.它甚至与普通的自由函数指针无关.在紧急情况下,您可以将void指针的自由函数模拟定义为typedef void(*voidf)();,但这仅适用于自由函数.对于指向成员的函数,没有一般性的东西,因为PTMF的精确实现取决于类的性质(简单,多态,虚拟派生,......).

  • @JosephH:不,你错了.看我对这个问题的评论. (3认同)
  • @myrkos:他们不是指针.它们可以是编译器定义的某些结构的对象.那些对象不是指针.所以`sizeof(such_object)`可能与`sizeof(void*)`不同. (2认同)