Finału nie można zastosować do funkcji niewirtualnych.
error: only virtual member functions can be marked 'final'
Możliwość oznaczenia metody niewirtualnej jako „ostatecznej” nie miałaby większego sensu. Dany
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()zawsze zadzwonię A::foo.
Ale jeśli A virtual:: foo byłby, to B :: foo by go zastąpił. Może to być niepożądane, dlatego też miałoby sens, aby funkcja wirtualna była ostateczna.
Pytanie brzmi jednak, dlaczego pozwalają na końcowy funkcji wirtualnych. Jeśli masz głęboką hierarchię:
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 */ };
Następnie finalustawia „podłogę” na temat tego, ile można zignorować. Inne klasy mogą rozszerzać A i B i zastępować je foo, ale jeśli klasa rozszerza C, to nie jest to dozwolone.
Więc prawdopodobnie nie ma sensu tworzyć foo „najwyższego poziomu” final, ale może mieć sens niżej.
(Myślę jednak, że jest miejsce, aby rozszerzyć słowa końcowe i zastąpić je członkami niewirtualnymi. Miałyby jednak inne znaczenie).
virtualsłowa kluczowego, czy nie.