A cosa serve in c++ dynamic_cast< tipo >( ) ???????
A cosa serve in c++ dynamic_cast< tipo >( ) ???????
La stupidità umana e l'universo sono infinite.
Della seconda non sono certo(Einstein)
Gnu/Linux User
dynamic_cast<Tipo>(Expr) E' un cast tra puntatori, viene fatto a run-time e non a tempo di compilazione, poiche' il tipo di Expr e' noto solo a tempo di esecuzione!
un oggetto puo' avere tipo statico e tipo dinamico diversi!
mi spiego:
se ho una classe A e una classe B che deriva da A posso fare questo:
B b;
A *a=&b;
/*..........................*/
B *b1=dynamic_cast<B*>(a);
if(b1) cout<<"il cast ha avuto successo"<<endl;
In questo esempio 'a' e' un puntatore a un oggetto di B (che deriva da A). A e' il tipo statico di 'a'(in realta' A*), B e' il tipo dinamico di 'a'!
E' possibile accedere ai campi dati o ai metodi della classe B tramite 'a', ma questo e' legale solo se il tipo dinamico di 'a' e' B!questo controllo puo' essere fatto con un dynamic_cast!
B* e' il tipo a cui vogliamo castare 'a' (che ha tipo A*); se il cast ha successo significa che 'a' aveva tipo dinamico B, altrimenti b1 sara' un puntatore nullo!!
spero di essere stato abbastanza chiaro
ciao
Cioe ora b1 puo accedere sia ai membri sia ai campi di A sia di B come una funz friend?codice:B b; A *a=&b; /*..........................*/ B *b1=dynamic_cast<B*>(a); if(b1) cout<<"il cast ha avuto successo"<<endl;
La stupidità umana e l'universo sono infinite.
Della seconda non sono certo(Einstein)
Gnu/Linux User
No!dopo il cast b1 puo accedere a campi dati e metodi di B,perche' e' un tipo B* e ha tipo dinamico B(A non centra piu')
In effetti prima non l'avevo detto, cmq tu hai un puntatore di tipo classe madre che punta a qualche figlio!poiche nei figli non ci sono le stesse e identiche funzioni, volendo richiamare una particolare funzione di un particolare figlio,il puntatore i tipo classe madre deve essere castato a puntatore di tipo figlio particolare!
dopo il cast quindi ottieni un puntatore che ha tipo statico e dinamico uguali,quindi puoi accedere a quella particolare classe senza problemi!
In pratica il dynamic_cast si utilizza soprattutto per verificare il tipo di dati su cui si sta lavorando a run-time. Il tipo di dato base deve essere polimorfo (ovviamente). Forse con questo esmpio ti è piu' chiaro:
hai la seguente struttura:
BASE -----> LIBRO
|
|--------> GIORNALE
ovvero una classe base da cui derivi le classi libro e giornale. Ora implementi una classe Edicola che conterrà una lista di oggetti che possono essere appartenenti o a Libro o a Giornale. Come fai a capire su quale tipo di oggetto stai lavorando? Usando il dynamic_cast.
bye
There are 10 kinds of people in the world: who knows the binary numeration and who not