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ключевое слово или нет.