2011-01-28 3 views
6

Ho appena scoperto che C++/CLI ha una parola chiave che non è presente (AFAIK) su C++ standard: override.Override esplicito della funzione virtuale

Non so molto di C++/CLI, quindi, qualcuno può spiegare per quale scopo è incluso lì, e se è una funzionalità desiderabile da aggiungere a C++?

+0

Lei non ha detto quello che la parola chiave che stai pensando di è. È "esplicito"? Se è così, è in C++ standard. –

+3

@Wes Hardaker In realtà ho detto. È la parola chiave "override". – kunigami

risposta

12

override è un'estensione di parola chiave speciale di Microsoft che può essere utilizzata nelle implementazioni C++/CLI e Visual C++. È simile all'annotazione @Override in Java o override in C# e fornisce migliori controlli del tempo di compilazione nel caso in cui non si sovrascriva qualcosa che si intendeva.

Dal primo link:

override indica che un membro di un tipo gestito deve sostituire una classe base o un membro interfaccia di base. Se non ci sono membri da sovrascrivere, il compilatore genererà un errore.

override è valido anche per la compilazione di destinazioni native (senza/clr). Vedi Sostituisci gli specificatori e le compilazioni native per maggiori informazioni.

override è una parola chiave sensibile al contesto. Vedere Parole chiave sensibili al contesto per ulteriori informazioni.

A partire dallo standard C++ 11, l'identificatore override è ora una parola chiave standard. Il supporto è ancora limitato e, come per questo page from Apache StdCxx, override è supportato da GCC 4.7+, Intel C++ 12.0+ e Visual C++ 2012 (con supporto di pre-standardizzazione in Visual C++ 2005).

0

Da here:

Se si contrassegna una proprietà o un metodo in una classe genitore con la parola chiave virtual , quando deriva una classe da esso, si può ignorare il metodo o proprietà e non implementalo. Tuttavia, se si decide di implementare la proprietà o il metodo , è necessario indicare che l'utente sta fornendo una nuova versione della proprietà o del metodo . Fornire una nuova versione di una proprietà o un metodo è a cui si fa riferimento come sovrascrivendolo.

Quando si esegue l'override di una proprietà o di un metodo , è necessario indicare questo scrivendo la parola chiave override alla sua destra.

Ora seguire la link per vedere alcuni esempi.

+0

Questo spiega i meccanismi della parola chiave override. Non spiega perché è stato introdotto. –

+0

Come il numero 2 di Rob, questo non è vero. La corrispondenza della firma di una funzione dichiarata virtuale in una classe base è sufficiente per sovrascrivere una funzione, la parola chiave 'override' può essere omessa e la funzione sarà comunque sovrascritta. Le nuove parole chiave non possono essere rese obbligatorie senza rompere enormi quantità di codice esistente. –

1

aiuta il compilatore catturare i vostri errori in due modi:

  1. Se si dichiara una funzione con override nella tua classe, ma la classe di base non ha questa funzione, quindi il compilatore può dire che non stai ignorando quello che pensavi di essere. Se override non fosse disponibile, il compilatore non sarebbe in grado di riconoscere il tuo errore - semplicemente supporrà che hai intenzione di introdurre una nuova funzione.

  2. Se si dispone di una funzione nella classe discendente (senza override) e quindi si dichiara la stessa funzione di virtuale nella classe base, il compilatore può dire che la modifica nella classe base ha influito sul significato di la dichiarazione originale nel discendente. Il discendente dovrà utilizzare override o sarà necessario modificare la firma di una delle funzioni.

Questa funzione è già stata aggiunta a C++ 0x.

+1

Non penso che il # 2 sia vero. È possibile eseguire l'override delle funzioni senza utilizzare la parola chiave 'override'. Un sacco di codice esistente si romperebbe se questo fosse mai cambiato. –

0

La parola chiave override in C++/CLI proviene da .Net e non una parte dello stesso C++. Poiché l'override è già stato spiegato, è necessario conoscere l'alternativa. Se non lo "sovrascrivi", potresti volerlo rendere "nuovo". Rendendolo "nuovo" non si esegue l'override del membro della classe genitore nel figlio ma si crea un nuovo membro con lo stesso nome. Le parole chiave new e override differiscono solo quando si utilizza un puntatore della classe base e lo si punta a un oggetto classe derivato.

Quindi, se si utilizza un puntatore alla classe base e puntare a un oggetto di classe derivata:

If you call an "override"n member: 
     the derived class member is called 
if you call the "new"ed member: 
     the base class member is called.