Final não pode ser aplicado a funções não virtuais.
error: only virtual member functions can be marked 'final'
Não seria muito significativo poder marcar um método não virtual como 'final'. Dado
struct A { void foo(); };
struct B : public A { void foo(); };
A * a = new B;
a -> foo(); // this will call A :: foo anyway, regardless of whether there is a B::foo
a->foo()sempre ligará A::foo.
Mas, se A :: foo estivesse virtual, então B :: foo o substituiria. Isso pode ser indesejável e, portanto, faria sentido tornar a função virtual final.
A questão é, porém, por que permitir final em funções virtuais. Se você tem uma hierarquia profunda:
struct A { virtual void foo(); };
struct B : public A { virtual void foo(); };
struct C : public B { virtual void foo() final; };
struct D : public C { /* cannot override foo */ };
Em seguida, finalcoloca um "piso" sobre o quanto a substituição pode ser feita. Outras classes podem estender A e B e substituir suas foo, mas se uma classe estender C, não será permitido.
Portanto, provavelmente não faz sentido fazer o 'nível superior' final, mas pode fazer sentido mais abaixo.
(Acho que há espaço para estender as palavras final e substituir os membros não virtuais. Eles teriam um significado diferente.)
virtualpalavra - chave ou não.