我正在尝试打印虚拟成员函数的地址。 如果我知道哪个类实现了我可以编写的函数:
print("address: %p", &A::func);
但是我想做这样的事情:
A *b = new B();
printf("address: %p", &b->func);
printf("address: %p", &b->A::func);
然而,这并不能编译。是否可以做这样的事情,也许在运行时查找 vtable 中的地址?
最佳答案
目前在 C++ 中没有执行此操作的标准方法,但信息必须在某处可用。否则程序怎么调用函数呢?但是,GCC 提供了一个扩展,允许我们检索虚函数的地址:
void (A::*mfp)() = &A::func;
printf("address: %p", (void*)(b->*mfp));
...假设成员函数具有原型(prototype) void func()
。
当您想要缓存虚函数的地址或在生成的代码中使用它时,这会非常有用。除非您指定 -Wno-pmf-conversions
,否则 GCC 将警告您有关此构造的信息。它不太可能与任何其他编译器一起工作。
关于c++ - 虚拟成员函数的打印地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29050343/