Final не может применяться к не виртуальным функциям.
error: only virtual member functions can be marked 'final'
Не имеет смысла отмечать невиртуальный метод как «окончательный». Дано
struct A { void foo(); };
struct B : public A { void foo(); };
A * a = new B;
a -> foo();
a->foo()
всегда буду звонить A::foo
.
Но если A :: foo был virtual
, то B :: foo переопределил бы его. Это может быть нежелательно, и, следовательно, имеет смысл сделать виртуальную функцию окончательной.
Однако возникает вопрос, зачем разрешать final для виртуальных функций. Если у вас глубокая иерархия:
struct A { virtual void foo(); };
struct B : public A { virtual void foo(); };
struct C : public B { virtual void foo() final; };
struct D : public C { };
Затем final
ставится «пол» относительно того, сколько переопределений можно сделать. Другие классы могут расширять A и B и переопределять их foo
, но если класс расширяет C, это не допускается.
Так что, вероятно, нет смысла создавать foo «верхнего уровня» final
, но это может иметь смысл ниже.
(Я думаю, что есть место для расширения слов final и override на невиртуальные члены. Однако они будут иметь другое значение.)
virtual
ключевое слово или нет.