Perché il casting dinamico da base a derivato è consentito solo per le classi polimorfiche [duplicato

StackOverflow https://stackoverflow.com/questions/8850044

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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top