Condividi tramite


Cast

Nel linguaggio C++ se una classe è derivata da una classe base che contiene funzioni virtuali, un puntatore a quel tipo della classe base può essere utilizzato per chiamare le implementazioni delle funzioni virtuali che si trovano nell'oggetto classe derivata. La classe che contiene le funzioni virtuali è talvolta detta "classe polimorfica".

Poiché una classe derivata completamente contiene le definizioni di tutte le classi di base da cui deriva, è possibile eseguire il cast di un puntatore alla gerarchia di classi a una di queste classi base. Dato un puntatore a una classe base, è possibile eseguire la riduzione del puntatore nella gerarchia. Questo è possibile se l'oggetto a cui si sta puntando è effettivamente di un tipo derivato dalla classe base. In questo caso, l'oggetto effettivo è definito "oggetto completo". Al puntatore alla classe base viene detto di puntare a un "oggetto secondario" dell'intero oggetto. Si consideri ad esempio la gerarchia di classe illustrata nella figura che segue.

Gerarchia di classi

Gerarchia delle classi

Un oggetto di tipo C potrebbe essere visualizzato come illustrato di seguito.

La classe C con oggetto secondario B e oggetto secondario A

Classe C con sottoggetti B e A

Data un'istanza della classe C, esiste un oggetto secondario B e un oggetto secondario A. L'istanza di C, inclusi gli oggetti secondari A e B, è "l'oggetto completo".

Utilizzando le informazioni del tipo di runtime, è possibile verificare se un puntatore punti effettivamente a un oggetto completo e possa essere eseguito il cast in modo sicuro a un altro oggetto nella relativa gerarchia. L'operatore dynamic_cast può essere utilizzato per eseguire questi tipi di cast. Esegue inoltre la verifica del runtime necessaria per rendere l'operazione sicura.

Per la conversione dei tipi non polimorfici, è possibile utilizzare l'operatore static_cast (in questo argomento viene illustrata la differenza tra le conversioni di cast statiche e dinamiche e quando è consigliabile utilizzarle).

In questa sezione vengono trattati i seguenti argomenti:

Vedere anche

Riferimenti

Espressioni (C++)