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).
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).
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.
Czy ta propozycja jest ponownie rozważana pod kątem przyszłej rewizji normy? – Xeo
@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. –
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
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:
Włącz powyżej dwóch ostrzeżeń za pomocą kodu.
#pragma warning(default:4263)
#pragma warning(default:4266)
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.
Ostrzeżenia VC++ dotyczą _include_ override, jeśli nie mają zastosowania. Pytanie wymagało ostrzeżenia przed ominięciem. – mskfisher
@HansPassant: Visual C++? – Mehrdad
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
@Mehrdad: ___Nie myślę, że coś jest nie tak z tym pytaniem .___ Jeśli to naprawdę się zamknie, powinno być ponownie otwarte. – sbi