以下 C++ 代码:
struct B
{
virtual ~B() {}
};
struct D : B {};
int main()
{
B* b = new D;
cout << typeid(*b).name() << endl;
}
打印:
1D
于是typeid发现基类类型B的指针实际上指向了派生类D。
AFAIK,RTTI 存储在每个类的进程的常量内存中。 我还知道每个类的vtable只存储指向该类的虚函数的指针 (或者也许我错了,vtable也存储RTTI?)
那么对于多态类 RTTI 来说,也许有一个表,其中包含指向 vtable 的键指针和值类型信息?
“vtavles”不仅仅包含函数指针数组。
为了解决一些转换问题,您最终必须对所涉及的类型名称进行相当于字符串比较的操作。如果您希望来自不同 dll 的两个类能够与相同的共享类型进行互操作,则尤其如此。 (这就是您想要使用匿名命名空间进行类型版本控制的原因)。
在这里您可以看到从 vtable 指针中拉出的类型的损坏名称。