RTTI 如何在运行时知道多态类型对象的类?

问题描述 投票:0回答:1

以下 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 的键指针和值类型信息?

c++ rtti vtable typeid typeinfo
1个回答
0
投票

“vtavles”不仅仅包含函数指针数组。

为了解决一些转换问题,您最终必须对所涉及的类型名称进行相当于字符串比较的操作。如果您希望来自不同 dll 的两个类能够与相同的共享类型进行互操作,则尤其如此。 (这就是您想要使用匿名命名空间进行类型版本控制的原因)。

在这里您可以看到从 vtable 指针中拉出的类型的损坏名称。

© www.soinside.com 2019 - 2024. All rights reserved.