考虑这个简单的层次结构:
class Base { public: virtual ~Base() { } };
class Derived : public Base { };
试图将 Base* p
向下转换为 Derived*
可以使用 dynamic_cast<Derived*>(p)
。我曾经认为 dynamic_cast
是通过比较在 p
中的 vtable 指针和一个 Derived
对象中的指针来工作的。
但是如果我们从 Derived
派生另一个类呢? 现在我们有:
class Derived2 : public Derived { };
在这种情况下:
Base* base = new Derived2;
Derived* derived = dynamic_cast<Derived*>(base);
尽管 Derived2
中的虚表指针与 Derived
中的虚表指针无关,我们仍然可以进行成功的向下转型。
它是如何实现的呢?dynamic_cast
如何知道 Derived2
是从 Derived
派生的(如果 Derived
是在另一个库中声明的怎么办)?
我想要了解有关此实现的具体细节(最好是在 GCC 中,其他也可以)。这个问题并不是这个问题的重复,后者没有指定实现方式。