|
Each of the forms of:
virtual void f() override final;
|
virtual void f() override;
|
virtual void f() final;
|
virtual void f();
|
|
void f() override final;
|
void f() override;
|
void f() final;
|
void f();
|
means something subtly and slightly different.
Each means:
virtual void f() override final; // is virtual, must override, cannot be overriden
|
virtual void f() override; // is virtual, must override, may be overriden
|
virtual void f() final; // is virtual, may be overriden
|
virtual void f(); // is virtual
|
|
void f() override final; // require virtual, must override, cannot be overriden
|
void f() override; // require virtual, must override
|
void f() final; // require virtual, cannot be overriden
|
void f(); // may or may not be virtual.
|
Some things to note:
- The `virtual override final` form is the same as the `override final` form which is the same as the `final` form.
- The `virtual override` form is the same as the `override` form.
- The `virtual final` form may be a 1st generation function!
- The `virtual` form may ALSO be a 1st generation function!
Looking at all of the forms again:
virtual void f() override final; // Superfluous syntax for `void f() final;`
|
virtual void f() override; // Superfluous syntax for `void f() override;`
|
virtual void f() final; // Dangerous form – may not be overriding
|
virtual void f(); // Not necessarily the 1st generation function, uncertain.
|
|
void f() override final; // Superfluous syntax for `void f() final;`
|
void f() override; // Tersest syntax for this form.
|
void f() final; // Tersest syntax for this form.
|
void f(); // Uncertain form.
|
This means that no more than 1 of the keywords `virtual`, `override`, or `final` should be used on a function declaration.
|