Рассмотрим следующий код:
#include <iostream>
class B {
virtual void f() {
std::cout << "Base" << '\n';
}
};
class D final: public Base {
void f() final override {
std::cout << "Derived" << '\n';
}
};
Обращая внимание на два использования приведенного выше контекстного ключевого слова final
- доступного после C ++ 11 - мы можем наблюдать следующее:
- Добавление
final
к функции-члену D
f()
предотвращает переопределение f()
в классе, производном от D
.
- Добавление
final
к классу D
предотвращает его дальнейшее образование .
Следовательно, невозможно, чтобы функция-член f()
была переопределена классом, производным от D
, поскольку такой производный класс не может существовать из-за final
, примененного к классу D
.
Есть ли смысл использовать final
в качестве управления переопределением для virtual
функции-члена класса, объявленного как final
? Или это просто избыточно?