打印虚拟成员函数的地址

hid*_*yat 31 c++ virtual vtable

我正在尝试打印虚拟成员函数的地址.如果我知道哪个类实现了我可以编写的函数:

print("address: %p", &A::func);
Run Code Online (Sandbox Code Playgroud)

但我想做这样的事情:

A *b = new B();

printf("address: %p", &b->func); 
printf("address: %p", &b->A::func);
Run Code Online (Sandbox Code Playgroud)

但是这不会编译.是否有可能做这样的事情,也许在运行时查找vtable中的地址?

小智 13

目前,在C++中没有标准的方法,尽管信息必须在某处可用.否则,程序如何调用该函数?但是,GCC提供了一个扩展,允许我们检索虚函数的地址:

void (A::*mfp)() = &A::func;
printf("address: %p", (void*)(b->*mfp));
Run Code Online (Sandbox Code Playgroud)

...假设成员函数具有原型void func().当您想要缓存虚拟函数的地址或在生成的代码中使用它时,这非常有用.除非您指定,否则GCC将警告您此构造-Wno-pmf-conversions.它不太可能与任何其他编译器一起使用.


Ash*_*ain 6

指向成员函数的指针并不总是简单的内存地址.请参阅本文中的表,其中显示了不同编译器上的成员函数指针的大小 - 有些指针最多可达20个字节.

正如文章概述的那样,成员函数指针实际上是一组实现定义的数据,以帮助通过指针解析调用.您可以存储并调用它们,但如果要打印它们,您打印什么?最好将其视为一个字节序列并通过它获取其长度sizeof.

  • 然而问题仍然存在:你如何识别通过"虚拟"调用来调用的函数? (5认同)