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.它不太可能与任何其他编译器一起使用.