【发布时间】:2013-08-23 23:08:06
【问题描述】:
考虑这个简单的层次结构:
class Base { public: virtual ~Base() { } };
class Derived : public Base { };
使用dynamic_cast<Derived*>(p) 可以尝试将Base* p 向下转换为Derived*。我曾经认为dynamic_cast 的工作原理是将p 中的vtable 指针与Derived 对象中的指针进行比较。
但是如果我们从Derived 派生另一个类呢?我们现在有:
class Derived2 : public Derived { };
在这种情况下:
Base* base = new Derived2;
Derived* derived = dynamic_cast<Derived*>(base);
即使Derived2 中的vtable 指针与Derived 中的vtable 指针无关,我们仍然可以成功向下转换。
它实际上是如何工作的? dynamic_cast 怎么知道Derived2 是否派生自Derived(如果Derived 在不同的库中声明会怎样)?
我正在寻找有关其实际工作原理的具体细节(最好在 GCC 中,但其他也很好)。这个问题不是与this question 的重复(没有具体说明它是如何工作的)。
【问题讨论】:
-
它可能在不同的编译器中实现不同,以确保您可能想阅读它们的源代码......
标签: c++ dynamic-cast