Используйте `final` для классов умеренно
Причина
Ограничение иерархии классами final редко требуется по логическим причинам и может нанести ущерб расширяемости иерархии.
Пример (плохой)
class Widget { /* ... */ };
// никто никогда не захочет улучшить My_widget (или так казалось)
class My_widget final : public Widget { /* ... */ };
class My_improved_widget : public My_widget { /* ... */ }; // ошибка: нельзя
Примечание
Не каждый класс предназначен для использования в качестве базового. Большинство классов стандартной библиотеки являются примерами этого (например, std::vector и std::string не предназначены для наследования). Это правило касается использования final для классов с виртуальными функциями, предназначенных для интерфейсов иерархии классов.
Примечание
Утверждения об улучшении производительности от final должны подкрепляться доказательствами. Слишком часто такие утверждения основаны на догадках или опыте работы с другими языками.
Есть примеры, где final может быть важен как по логическим, так и по причинам производительности. Один пример — критически важная для производительности иерархия AST в компиляторе или инструменте анализа языка. Новые производные классы не добавляются каждый год и только разработчиками библиотек. Однако злоупотребления являются (или, по крайней мере, были) значительно более распространёнными.
Контроль
Помечать использования final для классов.