其他分享
首页 > 其他分享> > c – 虚拟成员函数的打印地址

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