Perché il casting dinamico da base a derivato è consentito solo per le classi polimorfiche [duplicato
-
27-10-2019 - |
Domanda
Possibile duplicato:
FAQ: Perché Dynamic_Cast funziona solo se una classe ha almeno 1 metodo virtuale?
Ho letto che in C ++, eseguendo un cast dinamico nella gerarchia di una serie di classi, il cast è consentito solo in una situazione in cui le classi sono polimorfiche, come quando la classe base ha una funzione virtuale, ecc. Il motivo di questa limitazione? È più "sicuro" avere una funzione virtuale pura al posto della normale funzione virtuale nella classe base?
Grazie!
Soluzione
Qual è la ragione di questa limitazione?
dynamic_cast
dovrebbe avere solo successo quando l'oggetto è un'istanza del tipo di destinazione. Le classi non polimorfiche non contengono informazioni di tipo, quindi non c'è modo di dire se questo è il caso; Pertanto, il cast non può avere successo.
È più "sicuro" avere una funzione virtuale pura al posto della normale funzione virtuale nella classe base?
O va bene, per quanto riguarda il polimorfismo. Se la classe di base ha almeno una funzione virtuale, allora è polimorfica e quindi può essere utilizzata con dynamic_cast
. Che si tratti di puro o non solo influisce sul fatto che la classe di base possa essere istanziata.
Altri suggerimenti
È una limitazione indotta dallo standard.
Nelle importanti implementazioni, dynamic_cast
funziona confrontando il vfptr
- Puntatore della tabella delle funzioni virtuali - di due classi.
Questo è un modo per determinare se le classi sono correlate in fase di esecuzione. Inoltre, non avrebbe davvero senso fare un dynamic_cast
su classi non polimorfiche. C'è static_cast
per quello.
La mia ipotesi è che tu stia facendo qualcosa di sbagliato, se stai cercando di usare dynamic_cast
su classi non polimorfiche. Se pubblichi un po 'di codice, potremmo aiutarti.
Quando si esegue a dynamic_cast
c'è un controllo di tipo eseguito in fase di esecuzione e std::bad_cast
Viene lanciata un'eccezione o il puntatore nullo viene restituito quando il cast è illegale. Il meccanismo che consente di farlo è chiamato Rtti.
Quando la classe non è polimorfica non c'è modo di eseguire quel tipà, poiché nessuna informazione di tipo viene memorizzata in fase di esecuzione.