考虑这个简单的层次结构:
class Base { public: virtual ~Base() { } };
class Derived : public Base { };
可以使用. Base* p
_ 我曾经认为通过将 vtable 指针与对象中的指针进行比较来工作。Derived*
dynamic_cast<Derived*>(p)
dynamic_cast
p
Derived
但是如果我们从中派生出另一个类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 中,但其他也很好)。这个问题不是这个问题的重复(没有具体说明它是如何工作的)。