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 final
ustawia „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).
virtual
słowa kluczowego, czy nie.