Is there any way to enforce the usage of the C++11 override
keyword in Visual C++ 2012?
(i.e. if I forget to say override
, then I want to get a warning/error.)
Is there any way to enforce the usage of the C++11 override
keyword in Visual C++ 2012?
(i.e. if I forget to say override
, then I want to get a warning/error.)
C++11 almost had what you want.
Originally the override
keyword was part of a larger proposal (N2928) which also included the ability to enforce its usage:
class A
{
virtual void f();
};
class B [[base_check]] : public A
{
void f(); // error!
};
class C [[base_check]] : public A
{
void f [[override]] (); // OK
};
The base_check
attribute would make it an error to override a virtual function without using the override
keyword.
There was also a hiding
attribute which says a function hides functions in the base class. If base_check
is used and a function hides one from the base class without using hiding
it's an error.
But most of the proposal was dropped and only the final
and override
features were kept, as "identifiers with special meaning" rather than attributes.
There are few ways to do this in VC++ and equivalent ways with GCC as well.
VC++
Below are the relevant warning numbers 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
To enable these two warnings, you can use one of following options:
Enable above two warnings using code.
#pragma warning(default:4263)
#pragma warning(default:4266)
Enable above two warnings in project settings > C/C++ > Command Line and then enter /w34263 /w34266. Here /wNxxxx option means enable xxxx warnings in Level N (N = 3 is default level). You can also do /wdNxxxx which disables the xxxx warning in level N.
GCC
GCC 5.1+ has added new warning suggest-override that you can pass as command line option -Wsuggest-override
.
Clang
Clang 3.5+ has -Winconsistent-missing-override
however this only detects cases if base class uses override but parent does not. You might want to take a look at clang-tidy tool as well.