Dynamic cast

Versione del 21 nov 2013 alle 14:20 di Pil56-bot (discussione | contributi) (smistamento lavoro sporco)
Il titolo di questa pagina non è corretto per via delle caratteristiche del software MediaWiki. Il titolo corretto è dynamic_cast.

Il linguaggio di programmazione C++, oltre al cast implicito fatto con (), dispone di 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 al run-time. Qualora l'operazione non sia valida il costrutto ritorna un puntatore a NULL.

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).

Voci correlate