2009-08-10 14 views

risposta

29

Utilizzare dynamic_cast quando si esegue il cast da un tipo di classe base a un tipo di classe derivata. Controlla che l'oggetto da trasmettere sia effettivamente del tipo di classe derivata e restituisca un puntatore nullo se l'oggetto non è del tipo desiderato (a meno che non si stia eseguendo il casting su un tipo di riferimento), quindi genera un'eccezione bad_cast.

Utilizzare static_cast se questo controllo extra non è necessario. Come ha detto Arkaitz, dal momento che dynamic_cast esegue il controllo extra, richiede informazioni RTTI e quindi ha un maggiore sovraccarico di runtime, mentre static_cast viene eseguito in fase di compilazione.

+2

possono essere utilizzati anche per i riferimenti di casting, nel qual caso generano un'eccezione sull'errore di trasmissione, piuttosto che restituire un punto nullo –

+0

dynamic_cast può persino generare un'eccezione in fase di runtime. –

+0

@Neil, Martin: grazie, ho modificato la mia risposta. –

2

Il cast dinamico richiede RTTI e un po 'di magia rispetto al lancio statico. static_cast è solo un cast di tempo compilato, controlla se la classe di origine può essere promossa alla classe casted da alcune regole semplici come ereditarietà.

Ad esempio, nei casi di ereditarietà virtuale solo dynamic_cast può risolvere la situazione.

Apart, dynamic_cast restituirà NULL se il cast non è possibile, quindi puoi prendere una decisione diversa.

D'altra parte, dynamic_cast è più lento, poiché implica l'esecuzione di un codice e, come detto in precedenza, richiede l'attivazione di RTTI che aumenta la dimensione dei file binari.

+0

dynamic_cast può persino generare un'eccezione in fase di esecuzione. I cast dinamici –

0

Se si parla di C++. Quindi static_cast non è sicuro tipo di casting. Può trasmettere al tuo tipo, ma se è sbagliato non genera alcun errore/messaggio. Quindi otterrai un cattivo oggetto da quello. E il dynamic_cast lancia un errore se il lancio fallisce :) Spero che questo aiuti! :)

3

dynamic_cast controlla le informazioni disponibili in fase di esecuzione, ad esempio RTTI, ma attraversa anche le gerarchie di classi per verificare se tale trasmissione è possibile.

check C++ type casting tutorial at cplusplus.com

2

static_cast è simile al vecchio cast stile C e può essere applicato a qualsiasi cosa. static_cast verrebbe utilizzato quando si è certi dei tipi in questione. Ad esempio, di solito utilizzo uno static_cast durante la trasmissione tra int e enum.

dynamic_cast può essere utilizzato solo con puntatori e riferimenti. In caso di mancato lancio, viene restituito un puntatore nullo. dynamic_cast viene generalmente utilizzato durante la risoluzione dei puntatori alle classi utilizzate nell'ereditarietà in cui si desidera assicurarsi che il puntatore che si sta trasmettendo sia del tipo previsto.

controllare anche C++ : Documentation : C++ Language Tutorial : Type Casting

+2

quello che dici di static_cast sarebbe in realtà più correttamente detto di reinterpret_cast –

+0

Sono d'accordo con anon, reintepret_cast è simile al cast di stile C. – Aminos

2

fusione statico viene effettuato dal compilatore: si considera il risultato come il tipo di destinazione, non importa quale. Lo fai quando sei assolutamente sicuro che l'argomento sia del tipo target.

Il lancio dinamico viene eseguito in fase di esecuzione e pertanto richiede informazioni sul tipo di runtime.Lo fai quando non sei sicuro del tipo che hai: il cast potrebbe fallire, il che è dimostrato dal fatto che il valore di ritorno è nullo. Può anche essere fatto solo per puntatori e riferimenti.

7

In alcuni contesti, come questo, "statico" si riferisce al tempo di compilazione e "dinamico" si riferisce al tempo di esecuzione.

Per il controllo in fase di compilazione, utilizzare static_cast (limitato a ciò che sa il compilatore). Per il controllo run-time, utilizzare dynamic_cast (limitato alle classi con RTTI). Per nessun controllo, utilizzare reinterpret_cast.

Problemi correlati