Dynamic cast

Versione del 8 apr 2008 alle 20:43 di SunBot (discussione | contributi) (Bot: Standardizzo interwiki)

Il linguaggio di programmazione C++, otre 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 verificando a run-time se l'operazione è valida. 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 i non attivare RTTI poiché questa funzionalità assorbe una quantità di risorse non trascurabile).