Per comprendere il sistema di trasmissione è necessario immergersi nel modello dell'oggetto.
La rappresentazione classica di un semplice modello di gerarchia è di contenimento: che se B
deriva dal A
allora l'oggetto B
sarà infatti contenere un A
sotto-oggetto a fianco i propri attributi.
Con questo modello, il downcasting è una semplice manipolazione puntatore, con un offset noto al momento della compilazione che dipende dal layout di memoria di B
.
Questo è quello static_cast do: un getto statico è doppiato statico perché il calcolo di quanto necessario per il getto viene effettuata al momento della compilazione, sia esso puntatori o conversioni (*).
Tuttavia, quando l'ereditarietà di virtual
inizia a diventare un po 'più difficile. Il problema principale è che con l'ereditarietà virtual
tutte le sottoclassi condividono la stessa istanza del subobject. Per fare ciò, B
avrà un puntatore a A
, anziché un A
corretto e l'oggetto classe base A
verrà istanziato all'esterno di B
.
Pertanto, al momento della compilazione è impossibile dedurre l'aritmetica del puntatore necessaria: dipende dal tipo di runtime dell'oggetto.
Ogni volta che c'è un tipo di runtime dipendenza, è necessario RTTI (Runtime Informazioni Tipo), e facendo uso di RTTI per calchi è il lavoro di dynamic_cast.
In sintesi:
- fase di compilazione bassi:
static_cast
- runtime bassi:
dynamic_cast
Gli altri due sono anche compilare in tempo getta, ma sono così specifico che è facile ricordare a cosa servono ... e sono maleodoranti, quindi meglio non usarli comunque.
(*) Come indicato da @curiousguy nei commenti, ciò vale solo per downcasting. A static_cast
consente l'upcasting indipendentemente dall'ereditarietà virtuale o semplice, anche se quindi il cast non è necessario.
fonte
2010-09-20 07:02:26
Bella risposta che mi ha fatto capire come funziona l'ereditarietà virtuale!+1 – undu
Mi piace la tua risposta, ma l'OP stava apparentemente chiedendo un errore per DOWNCASTING piuttosto che upcasting. – h9uest
@h9uest: Grazie per aver segnalato il problema, ho cambiato "up-casting" in "downcasting" e ora tutto è a posto. –