c – 虚拟成员函数的打印地址
作者:互联网
我正在尝试打印虚拟成员函数的地址.
如果我知道哪个类实现了我可以编写的函数:
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));
…假设成员函数具有原型void func().
当您想要缓存虚拟函数的地址或在生成的代码中使用它时,这非常有用.除非您指定-Wno-pmf-conversions,否则GCC将警告您此构造.它不太可能与任何其他编译器一起使用.
标签:vtable,c,virtual 来源: https://codeday.me/bug/20190923/1815577.html