How is dynamic_cast implemented
Consider this simple hierarchy:
class Base { public: virtual ~Base() { } };
class Derived : public Base { };
Trying to downcast Base* p to Derived* is possible using
dynamic_cast<Derived*>(p). I used to think dynamic_cast works by comparing
the vtable pointer in p to the one in a Derived object.
But what if we derive another class from Derived? We now have:
class Derived2 : public Derived { };
In this case:
Base* base = new Derived2;
Derived* derived = dynamic_cast<Derived*>(base);
We still get a successful downcast, even though the vtable pointer in
Derived2 has nothing to do with a vtable pointer in Derived.
How does it actually work? How can the dynamic_cast know whether Derived2
was derived from Derived (what if Derived was declared in a different
library)?
I am looking for specific details about how this actually works
(preferably in GCC, but others are fine too). This question is not a
duplicate of this question (which doesn't specify how it actually works).
No comments:
Post a Comment