Hoe het zoekwoord ‘overschrijven’ afdwingen?

Is er een manier om het gebruik van het C++11 overridetrefwoord in Visual C++ 2012 af te dwingen?

(d.w.z. als ik vergeet overridete zeggen, dan wil ik een waarschuwing/foutmelding krijgen.)


Antwoord 1, autoriteit 100%

C++11 had bijna wat je wilde.

Oorspronkelijk was het trefwoord overrideonderdeel 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_checkzou het een fout maken om een ​​virtuele functie te overschrijven zonder het sleutelwoord overridete gebruiken.

Er was ook een hiding-attribuut dat zegt dat een functie functies in de basisklasse verbergt. Als base_checkwordt gebruikt en een functie verbergt er een voor de basisklasse zonder hidingte gebruiken, dan is dat een fout.

Maar het grootste deel van het voorstel werd geschrapt en alleen de functies finalen overridewerden 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:

  1. 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.
  2. Schakel bovenstaande twee waarschuwingen in met code.

    #pragma warning(default:4263)
    #pragma warning(default:4266)
    
  3. 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 overridegebruiken, maar andere overschrijvende leden niet. Je zou ook eens kunnen kijken naar de clang-tidy tool.

Other episodes