В коде приложения, где весь код, производный от вашего класса, контролируется вами, я бы оставил большинство классов незапечатанными по умолчанию.Если вы нарушаете код, производный от вашего класса, изменяя базовый класс, вы можете просто исправить его.
Но запечатывание очень полезно в коде библиотеки.Если вы оставите класс незапечатанным, вы пообещаете не нарушать какой-либо код, производный от него.то есть вы увеличиваете свою общественную площадь.По умолчанию в библиотеках IMO площадь поверхности должна быть минимальной, что подразумевает запечатывание.
Но не всегда необходимо запечатывать весь класс.Этого может быть достаточно, чтобы запечатать некоторые или все виртуальные методы.Таким образом, код, производный от вашего класса, может только расширять его, но не изменять его текущие функциональные возможности путем переопределения метода.
Другой тип класса, который часто должен быть закрытым классом со семантикой значения.Гораздо сложнее реализовать правильное равенство и псевдо мутаторы для открытых классов.Поэтому я бы просто запечатал их и избегал дополнительной работы, если в этом нет особой необходимости.