Заключний не може бути застосований до невіртуальних функцій.
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
ключове слово чи ні.