Final non può essere applicato a funzioni non virtuali.
error: only virtual member functions can be marked 'final'
Non sarebbe molto significativo essere in grado di contrassegnare un metodo non virtuale come 'finale'. Dato
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()
chiamerà sempre A::foo
.
Ma, se fosse A :: foo virtual
, allora B :: foo lo avrebbe annullato. Questo potrebbe essere indesiderabile, e quindi avrebbe senso rendere definitiva la funzione virtuale.
La domanda è: perché consentire le funzioni finali su virtuali. Se hai una gerarchia profonda:
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 */ };
Quindi final
mette un "piano" su quanto può essere fatto l'override. Altre classi possono estendere A e B e sovrascriverle foo
, ma una classe estende C quindi non è consentita.
Quindi probabilmente non ha senso rendere il final
piumino di "livello superiore" , ma potrebbe avere un senso più in basso.
(Penso che ci sia spazio per estendere le parole final e sovrascrivere ai membri non virtuali. Avrebbero comunque un significato diverso.)
virtual
parola chiave o meno.