2012-11-04 13 views
44

Gibt es eine Möglichkeit, die Verwendung des Schlüsselwortes C++ 11 override in Visual C++ 2012 zu erzwingen?Wie erzwinge das Schlüsselwort 'override'?

(das heißt, wenn ich vergesse override sagen, dann möchte ich eine Warnung/Fehler erhalten.)

+3

@HansPassant: Visual C++? – Mehrdad

+10

Warum wird diese Frage geschlossen? Stimmt etwas nicht mit Fragen zu C++ - Compiler-Warnungen? (Wenn die Antwort "nein" ist, dann ist das doch eine absolut gültige Antwort ..) – Mehrdad

+12

@Mehrdad: ___Ich denke nicht, dass mit dieser Frage etwas nicht stimmt .___ Wenn es wirklich geschlossen wird, sollte es wieder geöffnet werden. – sbi

Antwort

21

C 11 ++ fast hatte, was Sie wollen.

Ursprünglich war der override Stichwort war Teil eines größeren Vorschlag (N2928), die auch die Fähigkeit, seine Verwendung zu erzwingen enthalten:

class A 
{ 
    virtual void f(); 
}; 

class B [[base_check]] : public A 
{ 
    void f(); // error! 
}; 

class C [[base_check]] : public A 
{ 
    void f [[override]](); // OK 
}; 

Das base_check Attribut würde er einen Fehler machen eine virtuelle Funktion außer Kraft zu setzen, ohne die Verwendung von override Schlüsselwort.

Es gab auch ein hiding Attribut, das besagt, dass eine Funktion Funktionen in der Basisklasse verbirgt. Wenn base_check verwendet wird und eine Funktion einen aus der Basisklasse verbirgt, ohne hiding zu verwenden, ist dies ein Fehler.

Aber der Großteil des Vorschlags wurde fallen gelassen und nur die final und override Funktionen wurden beibehalten, als "Kennungen mit besonderer Bedeutung" anstelle von Attributen.

+1

Wird dieser Vorschlag erneut für eine zukünftige Überarbeitung des Standards in Betracht gezogen? – Xeo

+3

@Xeo: Wenn sich niemand dafür einsetzt, wird es nicht angeschaut. Ich persönlich würde es einfach in einen Scheck einbringen, beispielsweise basierend auf dem Klingeln und die Überprüfung obligatorisch machen. –

+0

Beantwortet die Frage nicht ganz (da es zwar nicht in C++ 11 ist, Visual C++ jedoch immer noch eine Warnung enthält, die mir nicht bekannt ist), aber trotzdem gute Informationen, danke. +1 – Mehrdad

4

Es gibt einige Möglichkeiten, dies in VC++ und äquivalente Weise mit GCC zu tun.

VC++

Im Folgenden sind die entsprechenden Warnnummern in VC++:

C4263 (level 4) 'function': member function does not override any base class virtual member function 
C4266 (level 4) 'function': no override available for virtual member function from base 'type'; function is hidden 

diese beiden Warnungen zu aktivieren, können Sie eine der folgenden Optionen verwenden:

  1. Set Warnstufe bis 4 in den Projekteinstellungen und deaktivieren Sie dann die Warnungen, die Sie nicht möchten. Das ist mein bevorzugter Weg. Um unerwünschte Warnungen der Stufe 4 zu deaktivieren, gehen Sie zu den Projekteinstellungen> C/C++> Erweitert und geben Sie im Feld Bestimmte Warnungen deaktivieren die Warnnummern ein.
  2. Aktivieren Sie die obigen zwei Warnungen mit Code.

    #pragma warning(default:4263) 
    #pragma warning(default:4266) 
    
  3. über zwei Warnungen in Projekteinstellungen aktivieren> C/C++> Befehlszeile und geben Sie dann/w34263/w34266. Die Option "Here/wNxxxx" bedeutet, dass xxxx-Warnungen in der Ebene N aktiviert werden (N = 3 ist die Standardstufe). Sie können auch/wdNxxxx tun, die die xxxx Warnung in Ebene N. deaktiviert

GCC

GCC 5.1+ hinzugefügt neue Warnung vorschlagen-Überschreibung, die Sie als Befehlszeilenoption -Wsuggest-override passieren kann.

Clang

Clang 3.5+ hat -Winconsistent-missing-override jedoch nur diese Fälle erfasst, wenn der Basisklasse verwendet Überschreibung aber Eltern nicht. Vielleicht möchten Sie sich auch das Clang-Tidy-Tool ansehen.

+4

Diese VC++ - Warnungen gelten für _include_override, wo sie nicht gilt. Die Frage bestand darin, nach einem _missing_ override zu warnen. – mskfisher

Verwandte Themen