Ereditarieta', static_cast e dynamic_cast

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
lup0z
Prode Principiante
Messaggi: 110
Iscrizione: giovedì 11 gennaio 2007, 14:36

Ereditarieta', static_cast e dynamic_cast

Messaggio da lup0z »

Ciao a tutti,
non riesco a capire la differenza tra lo static_Cast e il dynamic_Cast nel caso dell'ereditarietà.
Tutti e due controllano il tipo dinamico a run-time per un safe cast, ma alla fine la differenza qual'è?
Grazie!
Avatar utente
Spinus
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1397
Iscrizione: mercoledì 21 febbraio 2007, 23:09

Re: Ereditarieta', static_cast e dynamic_cast

Messaggio da Spinus »

Riguardando gli appunti di un corso di C++ ho trovato che
  • static_cast : non effettua controllo di compatibilità a runtime e non può convertire tra loro classi base; puoi passare dalla classe derivata alla classe base
  • dynamic_cast: effettua controllo e genera eccezioni in caso di incompatibilità; puoi passare da una classe base virtuale ad una derivata (può essere usato per passare da una classe (con ereditarietà multipla) ad una delle classi base...
Spero di non aver detto delle cavolate  ;D
kiwiproject.wordpress.com

Linux user # 465110
lup0z
Prode Principiante
Messaggi: 110
Iscrizione: giovedì 11 gennaio 2007, 14:36

Re: Ereditarieta', static_cast e dynamic_cast

Messaggio da lup0z »

Mhh...no mi sa che hai sbagliato a prendere appunti perché static_cast può effettuare conversioni dalla base alla derivata, se soddisfa la condizione al tipo dinamico :)
Dynamic_cast non lancia eccezioni, semplicemente se non va' a buon fine, restituisce 0 :)
Avatar utente
Spinus
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1397
Iscrizione: mercoledì 21 febbraio 2007, 23:09

Re: Ereditarieta', static_cast e dynamic_cast

Messaggio da Spinus »

Guarda ti incollo cosa c'è scritto sulle dispense..
static_cast(p)
...
Non può convertire tra  loro classi di base
Permette solo conversioni “in verticale” lungo l’asse ereditario
Quello che sicuramente non puoi fare è convertire classi base tra loro con lo static_cast; probabilmente il "verticale" intende nei due sensi, sia base-derivata che derivata-base, però non hai alcun controllo di compatibilità a run-time ...

Per il dynamic_cast
Effettua controllo di compatibilità run-time assicurando cast sicuri tra tipi di classi
Applicato a un puntatore ritorna 0 se il cast non è valido
Applicato a un riferimento genera un’eccezione in caso di incompatibilità
Può effettuare il “downcast” da una classe virtuale di base ad una derivata
Spero che così sia un po' più chiaro  ;D
kiwiproject.wordpress.com

Linux user # 465110
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti