Final не может быть применен к не виртуальным функциям.
error: only virtual member functions can be marked 'final'
Было бы не очень важно иметь возможность пометить не виртуальный метод как 'final'.Учитывая,
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()
всегда будет вызывать A::foo
.
Но, если A :: foo было virtual
, то B :: foo переопределит его.Это может быть нежелательно, и, следовательно, имеет смысл сделать виртуальную функцию окончательной.
Однако вопрос заключается в том, почему разрешает использовать финальную функцию для виртуальных функций.Если у вас есть глубокая иерархия:
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 */ };
Тогда final
ставит «пол» на сколько можно сделать переопределение.Другие классы могут расширять A и B и переопределять их foo
, но если класс расширяет C, тогда это не разрешено.
Так что, вероятно, не имеет смысла делать 'top-level' foo final
, но это может иметь смысл ниже.
(хотя, я думаю, есть место расширить слова final и override для не виртуальных членов. Хотя они будут иметь другое значение.)