考虑这个简单的层次结构:
class Base { public: virtual ~Base() { } };
class Derived : public Base { };
可以使用. Base* p_ 我曾经认为通过将 vtable 指针与对象中的指针进行比较来工作。Derived*dynamic_cast<Derived*>(p)dynamic_castpDerived
但是如果我们从中派生出另一个类Derived呢?我们现在有:
class Derived2 : public Derived { };
在这种情况下:
Base* base = new Derived2;
Derived* derived = dynamic_cast<Derived*>(base);
即使 in 中的 vtable 指针Derived2与 in 中的 vtable 指针无关,我们仍然可以成功地向下转型Derived。
它实际上是如何工作的?如何dynamic_cast知道是否Derived2源自Derived(如果Derived在不同的库中声明会怎样)?
我正在寻找有关其实际工作原理的具体细节(最好在 GCC 中,但其他也很好)。这个问题不是这个问题的重复(没有具体说明它是如何工作的)。