Il C++ 11 FDIS diceoverride di funzioni non virtuali
Se una funzione virtuale è contrassegnato con l'esclusione virt-specificatore e non ridefinisce una funzione membro di una classe base , il programma è mal formato. [Esempio:
struct B { virtual void f(int); }; struct D : B { void f(long) override; // error: wrong signature overriding B::f void f(int) override; // OK };
E se B::f
non sarebbe stato segnato virtuale? Il programma è malformato, quindi? Oppure è override
quindi da ignorare ». Non riesco a trovare alcuna gestione di questo caso nel testo std.
Aggiornamento 1/2 (unito) Ho inoltrato una richiesta agli editor C++ per esaminare le cose. Grazie Johannes per indicarmelo.
- "void f (lungo) override" non ridefinisce una funzione, esp. nessuno virtuale,
- quindi non è virtuale
- quindi il testo "Se una funzione virtuale è contrassegnato con ..." non si applica
- quindi l'esempio non corrisponde al testo.
Ma la realizzazione di questo ho trovato, che l'intenzione della "override" parola chiave contestuale non può essere soddisfatto: se un errore di battitura nel nome della funzione o il tipo di argomento sbagliato fa fare la funzione stessa non virtuale, quindi il testo dello standard non si applica mai e "override" è reso inutile.
La migliore soluzione possibile potrebbe essere
- mettendo "virtuale" di fronte a funzioni della esempio
B, non D. Ce n'è solo uno in B – towi
L'istruzione relativa al problema nella risposta aggiornata è già stata risolta con 9.2p9 (vedere la sezione commenti della risposta accettata). 9.2p9 proibisce di mettere "override" su funzioni non virtuali. L'unico problema che vedo è l'esempio e può essere risolto semplicemente mettendo "virtuale" prima della funzione "f" in "D". –
@litb: ok. grazie. aggiornato di nuovo. – towi