2011-09-23 4 views
23

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
+0

B, non D. Ce n'è solo uno in B – towi

+2

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". –

+0

@litb: ok. grazie. aggiornato di nuovo. – towi

risposta

22

E se B::f non sarebbe stata segnata virtuale? Il programma è mal formato, quindi?

Sì, lo è. Perché al fine di esclusione qualcosa, che qualcosa deve essere virtuale. In caso contrario, non è prioritario, è nasconde. Quindi, la risposta positiva segue dalla citazione nella tua domanda.

+2

Potete fornire un riferimento standard? –

+1

Non sono d'accordo: la formulazione che ho citato non fa alcuna dichiarazione su "funzioni non virtuali". Solo l'esempio Divertente 'void D :: f (long);' stesso è ** not ** * virtual *, perché non sovrascrive 'virtual void B :: f (int)'. Quindi il testo citato non si applica per l'aggiunta 'override' dietro' D :: f (long) '. Ecco perché mi sono confuso ... – towi

+1

@towi: La citazione dice: Se la funzione contrassegnata con virtual non esegue l'override *** ... allora il programma è mal formato. Il termine *** override *** può essere applicato *** solo *** a funzioni virtuali, quindi se la funzione, la cui firma coincide con la tua nuova funzione non è virtuale, allora questa nuova funzione non override ***, quindi la citazione si applica –

0

Se B:f era non virtuale, quindi entrambiD:f funzioni sarebbe mal formati.

+0

Perché? Il testo che ho citato si riferisce solo alle "funzioni verticali". Se 'B :: f' non è virtuale, il testo non si applica. – towi

+0

@towi Questo testo fa veramente riferimento a 'D :: f', non' B :: f'.Le funzioni 'D :: f' sono ancora virtuale ma cercare di ridefinire una funzione non-più-virtuale' B :: f', quindi entrambe le funzioni 'D :: f' sono mal formati. –

0

Sì, il programma è mal formato quando override viene aggiunto a qualsiasi funzione non virtuale.

In genere, le funzioni con firme diverse (sovraccarico) sono diverse quanto le funzioni con nomi diversi.L'esempio fornito nella specifica non intende implicare che il nome della funzione abbia effetto override. È pensato per mostrare l'errore comune che è stato progettato per prevenire override.