c++ - 虚拟成员函数的打印地址

标签 c++ virtual vtable

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

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/

相关文章:

c++ - 使用 openmp 并行化 for 循环并替换 push_back

c++ - 如果没有重复项,则将整数有效地插入到不断增长的数组中

c++ - 将方法作为构造函数参数传递

c++ - C++函数指针中的协变和逆变?

接口(interface)/基类中的 C# 枚举?

linux - 在 Linux 中创建一个虚拟文件

c++ - C++ 中的继承成本

c++ - 私有(private)纯虚函数的目的?

c++ - CRTP 与 GCC 中的去虚拟化标志

c++ - QObject 创建 moc 文件,但仍然出现 vtable 错误