Final no se puede aplicar a funciones no virtuales.
error: only virtual member functions can be marked 'final'
No sería muy significativo poder marcar un método no 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()
siempre llamare A::foo
.
Pero, si A :: foo lo fuera virtual
, entonces B :: foo lo anularía. Esto podría ser indeseable y, por lo tanto, tendría sentido hacer que la función virtual sea final.
La pregunta es, sin embargo, por qué permitir final en funciones virtuales. Si tienes una jerarquía 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 */ };
Luego, final
pone un 'piso' sobre la cantidad de anulación que se puede hacer. Otras clases pueden extender A y B y anular sus foo
, pero si una clase extiende C, entonces no está permitido.
Por lo tanto, probablemente no tenga sentido hacer el foo de "nivel superior" final
, pero podría tener sentido más abajo.
(Sin embargo, creo que hay espacio para extender las palabras final y anular a los miembros no virtuales. Sin embargo, tendrían un significado diferente).
virtual
palabra clave o no.