dynamic cast
Il linguaggio di programmazione C++, oltre al cast esplicito stile C (), dispone di altri quattro tipi di cast espliciti: const cast, dynamic_cast, reinterpret cast e static cast.
Il costrutto dynamic_cast permette di convertire un puntatore ad un oggetto di una classe base ad uno di classe derivata, ma solo se la classe base è polimorfa (ovvero possiede almeno un metodo virtuale, distruttore virtuale incluso). La validità dell'operazione viene verificata in run-time. Qualora l'operazione non sia valida il costrutto restituisce un puntatore nullo.
Esempio:
class Padre {.....};
class Figlio : public Padre {.....};
class Nipote : public Figlio {.....};
main ()
{
Padre *p, *pObj = new Padre;
Figlio *f, *fObj = new Figlio;
Nipote *n, *nObj = new Nipote;
p = nObj; // ok un puntatore ad una classe derivata può essere assegnato ad uno di classe base
n = p; // qui il compilatore genera errore perché non sa se l'assegnamento è valido (lo si sa solo run-time)
n = dynamic_cast<Nipote*>(p); // qui si chiede di fare il controllo run-time per validare la conversione (valida in questo caso)
if (n)
cout << "conversione eseguita con successo";
p = fObj;
n = dynamic_cast<Nipote*>(p); // qui si chiede di fare il controllo run-time per validare la conversione (non valida in questo caso)
if (!n)
cout << "conversione fallita";
}
Si tenga presente che affinché il costrutto dynamic_cast lavori correttamente è necessario che il supporto RTTI del compilatore sia attivo (spesso, nella produzione del firmware, si sceglie di non attivare RTTI poiché questa funzionalità assorbe una quantità di risorse non trascurabile).