La conversione di tipo sicura (type casting) in C++ è fornita dagli operatori di cast: static_cast, dynamic_cast, const_cast, reinterpret_cast.
nullptr per i puntatori o genererà un'eccezione per i riferimenti.Quando utilizzare:
dynamic_cast con basi virtuali. Per la conversione tra tipi semplici/compatibili — static_cast.Esempio:
struct Base { virtual ~Base() {} }; struct Derived : Base { void foo() {} }; void test_cast(Base* base) { // Conversione sicura in una classe derivata Derived* d = dynamic_cast<Derived*>(base); if (d) { d->foo(); } }
Domanda: È possibile fare un cast di un oggetto di classe base a una derivata usando static_cast, se l'oggetto non è realmente un'istanza della classe derivata?
Risposta: Sì, static_cast si compila, ma il comportamento sarà indefinito se l'oggetto non è realmente un oggetto della classe derivata. Solo dynamic_cast garantisce la sicurezza di tale conversione. L'uso di static_cast per un downcast è consentito solo se si è certi del tipo reale dell'oggetto.
Storia
In un grande sistema embedded, i cast tra la classe padre e quella figlia venivano effettuati tramite static_cast. In alcuni casi questo portava a crash durante il tentativo di accedere a campi inesistenti - il programma cercava di interpretare la memoria di un altro tipo.
Storia
Durante lo sviluppo di un'architettura basata su plugin, gli sviluppatori utilizzavano reinterpret_cast per convertire puntatori tra diversi tipi, il che portava alla lettura di spazzatura ed errori all'esecuzione, specialmente durante i tentativi di conversione dinamica tramite DLL.
Storia
In un framework aziendale generico, si dimenticava di aggiungere distruttori virtuali nella classe base, il che rendeva impossibile il corretto funzionamento di dynamic_cast e portava a perdite di memoria e corruzione durante la rimozione di un oggetto tramite un puntatore alla classe base.