Is er een manier om het gebruik van het C++11 override
trefwoord in Visual C++ 2012 af te dwingen?
(d.w.z. als ik vergeet override
te zeggen, dan wil ik een waarschuwing/foutmelding krijgen.)
Antwoord 1, autoriteit 100%
C++11 had bijna wat je wilde.
Oorspronkelijk was het trefwoord override
onderdeel van een groter voorstel (N2928) die ook de mogelijkheid omvatte om het gebruik ervan af te dwingen:
class A
{
virtual void f();
};
class B [[base_check]] : public A
{
void f(); // error!
};
class C [[base_check]] : public A
{
void f [[override]] (); // OK
};
Het kenmerk base_check
zou het een fout maken om een virtuele functie te overschrijven zonder het sleutelwoord override
te gebruiken.
Er was ook een hiding
-attribuut dat zegt dat een functie functies in de basisklasse verbergt. Als base_check
wordt gebruikt en een functie verbergt er een voor de basisklasse zonder hiding
te gebruiken, dan is dat een fout.
Maar het grootste deel van het voorstel werd geschrapt en alleen de functies final
en override
werden behouden, als “identifiers met speciale betekenis” in plaats van attributen.
Antwoord 2, autoriteit 64%
Er zijn weinig manieren om dit te doen in VC++ en ook op vergelijkbare manieren met GCC.
VC++
Hieronder staan de relevante waarschuwingsnummers 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
Om deze twee waarschuwingen in te schakelen, kunt u een van de volgende opties gebruiken:
- Stel waarschuwingsniveau in op 4 in de projectinstellingen en schakel vervolgens de waarschuwingen uit die u niet wilt. Dit is mijn favoriete manier. Om ongewenste niveau 4-waarschuwingen uit te schakelen, gaat u naar projectinstellingen > C/C++ > Geavanceerd en voer vervolgens waarschuwingsnummers in in het vak Specifieke waarschuwingen uitschakelen.
-
Schakel bovenstaande twee waarschuwingen in met code.
#pragma warning(default:4263) #pragma warning(default:4266)
-
Schakel bovenstaande twee waarschuwingen in projectinstellingen in > C/C++ > Opdrachtregel en voer vervolgens /w34263 /w34266 in. Hier betekent de optie /wNxxxx dat xxxx-waarschuwingen op niveau N worden ingeschakeld (N = 3 is het standaardniveau). U kunt ook /wdNxxxx doen, waardoor de xxxx-waarschuwing in niveau N wordt uitgeschakeld.
GCC
GCC 5.1+ heeft een nieuwe waarschuwingssuggestie-override toegevoegd die u kunt doorgeven als opdrachtregeloptie -Wsuggest-override
.
Klank
Clang 3.5+ heeft -Winconsistent-missing-override
, maar dit detecteert alleen gevallen als sommige overschrijvende leden of basisklassen override
gebruiken, maar andere overschrijvende leden niet. Je zou ook eens kunnen kijken naar de clang-tidy tool.