2012-11-04 16 views
44

Czy istnieje sposób na wymuszenie użycia słowa kluczowego C++ 11 override w programie Visual C++ 2012?Jak wymusić słowo kluczowe "zastąp"?

(tj jeśli zapomnę powiedzieć override, następnie chcę dostać ostrzeżenie/błąd).

+3

@HansPassant: Visual C++? – Mehrdad

+10

Dlaczego to pytanie jest zamknięte? Czy coś jest nie tak z pytaniami dotyczącymi ostrzeżeń kompilatora C++? (Jeśli odpowiedź brzmi "nie", to jest to ostatecznie poprawna odpowiedź.) – Mehrdad

+12

@Mehrdad: ___Nie myślę, że coś jest nie tak z tym pytaniem .___ Jeśli to naprawdę się zamknie, powinno być ponownie otwarte. – sbi

Odpowiedz

21

C++ 11 prawie miał co chcesz.

Pierwotnie kluczowe override był częścią większego projektu (N2928), który również zdolność do egzekwowania jej wykorzystania:

class A 
{ 
    virtual void f(); 
}; 

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

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

Atrybut base_check stałaby się błąd zastąpić funkcję wirtualnego bez użycia override słowo kluczowe.

Istnieje również atrybut hiding, który mówi, że funkcja ukrywa funkcje w klasie bazowej. Jeśli użyto base_check, a funkcja ukrywa jedną z klasy bazowej bez użycia hiding, jest to błąd.

Jednak większość propozycji została usunięta, a jedynie funkcje final i override były przechowywane jako "identyfikatory o specjalnym znaczeniu", a nie atrybuty.

+1

Czy ta propozycja jest ponownie rozważana pod kątem przyszłej rewizji normy? – Xeo

+3

@Xeo: Jeśli nikt nie będzie się o to lobbował, nie będzie go oglądać. Osobiście po prostu wprowadziłbym go do sprawdzenia, np. W oparciu o klang i sprawdzenie było obowiązkowe. –

+0

Nie * całkiem * odpowiedzieć na pytanie (ponieważ chociaż nie jest w C++ 11, Visual C++ może nadal mieć ostrzeżenie, którego nie znam), ale nadal dobre informacje, dziękuję. +1 – Mehrdad

4

Istnieje kilka sposobów, aby to zrobić w VC++ i równoważne sposoby z GCC.

VC++

Poniżej są odpowiednie numery ostrzegawcze w 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 

Aby włączyć te dwa ostrzeżenia, można użyć jednej z następujących opcji:

  1. ustawić poziom ostrzegawczy do 4 w ustawieniach projektu, a następnie wyłącz ostrzeżenia, których nie chcesz. To jest mój preferowany sposób. Aby wyłączyć niechciane ostrzeżenia na poziomie 4, przejdź do ustawień projektu> C/C++> Zaawansowane, a następnie wprowadź numery ostrzeżeń w polu Wyłącz określone ostrzeżenia.
  2. Włącz powyżej dwóch ostrzeżeń za pomocą kodu.

    #pragma warning(default:4263) 
    #pragma warning(default:4266) 
    
  3. Włącz powyżej dwóch ostrzeżeń w projekcie Ustawienia> C/C++> Wiersz polecenia, a następnie wpisz/w34263/w34266. Opcja tutaj/wNxxxx oznacza włączenie ostrzeżeń xxxx na poziomie N (N = 3 jest poziomem domyślnym). Można również zrobić/wdNxxxx który wyłącza ostrzeżenie xxxx Na poziomie N.

GCC

GCC 5.1+ został dodany nowy ostrzeżenie sugerują-override, który można przekazać jako opcja wiersza poleceń -Wsuggest-override.

Clang

Clang 3.5+ ma -Winconsistent-missing-override jednak to tylko wykrywa przypadki, jeśli klasa bazowa wykorzystuje nadpisanie ale rodzic nie. Możesz również rzucić okiem na narzędzie clang-tidy.

+4

Ostrzeżenia VC++ dotyczą _include_ override, jeśli nie mają zastosowania. Pytanie wymagało ostrzeżenia przed ominięciem. – mskfisher