我注意到Clang和GCC都为具有虚拟继承的非多态类型生成typeinfo。据我了解,这不是标准要求。他们为什么这样做,以及如何使用它?
示例:
#include <iostream>
#include <string>
#include <typeinfo>
struct VirtualBase {};
struct Derived : virtual VirtualBase{};
int main()
{
Derived md;
uintptr_t **vptr = (uintptr_t **)&md;
std::type_info * tinfo = (std::type_info *)(*vptr)[-1];
std::cout << tinfo->name() << "\n";
return 0;
}
输出:7Derived
阅读ABI文档后,我期望收到一个段错误而不是答案:
https://itanium-cxx-abi.github.io/cxx-abi/abi.html#vtable-components
typeinfo指针是多态类的有效指针,即 具有虚函数的代码,对于非多态类为零。