我想尝试看看我的编译器如何为多态类安排 v 表 - 查看函数地址等。在 C++ 代码中执行此操作的最佳方法是什么?
例如,如果我覆盖父类的方法,函数地址应该是子类中的地址。如果我没有重写,函数地址将是父类中的地址。
最佳答案
如果没有 hack,您无法获得虚拟函数的地址或有关 vmt 的其他一些信息。 在大多数情况下,类在内部看起来像这样的结构:
struct ClassInternal
{
void* vmt; // this field generate and add by compile automatically if class need vmt
int field0;
...
};
一些编译器按照 header 中定义的顺序对 VMT 中的地址函数进行排序(但它可以随时更改,请小心),首先是父类函数,然后是子类函数。
关于C++:如何找出 v 表的布局/地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21187032/