Заключний не може бути застосований до невіртуальних функцій.
error: only virtual member functions can be marked '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, тоді це не дозволено.
Тому, мабуть, не має сенсу робити "верхній рівень" foo final, але це може мати сенс нижче.
(Я думаю, що все ж є можливість поширити слова остаточні та замінити на невіртуальних членів. Хоча вони мали б інше значення.)
virtualключове слово чи ні.