considerare questo semplice gerarchia:Come è dynamic_cast implementato
class Base { public: virtual ~Base() { } };
class Derived : public Base { };
Cercando di downcast Base* p
-Derived*
è possibile utilizzando dynamic_cast<Derived*>(p)
. Ero abituato a pensare che dynamic_cast
funzioni confrontando il puntatore vtable in p
con quello in un oggetto Derived
.
Ma cosa succede se deriviamo un'altra classe da Derived
? Ora abbiamo:
class Derived2 : public Derived { };
In questo caso:
Base* base = new Derived2;
Derived* derived = dynamic_cast<Derived*>(base);
Abbiamo ancora ottenere un successo abbattuta, anche se il puntatore vtable in Derived2
non ha nulla a che fare con un puntatore vtable in Derived
.
Come funziona? Come può il dynamic_cast
sapere se Derived2
è stato derivato da Derived
(cosa succede se Derived
è stato dichiarato in una libreria diversa)?
I am in cerca di dettagli specifici su come funziona (preferibilmente in GCC, ma anche altri vanno bene). Questa domanda è non un duplicato di this question (che non specifica come effettivamente funziona).
Potrebbe essere implementata in modo diverso nei diversi compilatori, per essere sicuri che si potrebbe desiderare di leggere la fonte della loro ... – PlasmaHH