Полагаю, одним из возможных способов быстрого определения было бы рассмотреть вопрос о том, собираетесь ли вы иметь дело с кучей похожих классов, которые вы собираетесь использовать для выполнения тех же задач, с изменением way * 1002. * вы идете о выполнении этих задач.
Одним из тривиальных примеров будет проблема вычисления областей для различных геометрических фигур. Вам нужны площади квадратов, кругов, прямоугольников, треугольников и т. Д., И единственное, что здесь меняется, - это математические формулы (способ), который вы используете для вычисления площади. Поэтому было бы хорошим решением сделать так, чтобы каждая из этих форм наследовала от общего базового класса и добавить в базовый класс виртуальный метод, который возвращает область (которую затем можно реализовать в каждом дочернем элементе с соответствующей математической формулой). .
Если сделать все виртуальным «на всякий случай», ваши объекты будут занимать больше памяти. Кроме того, при вызове виртуальных функций возникают небольшие (но ненулевые) издержки. Так что, IMHO, делать все виртуальное «на всякий случай» было бы плохой идеей, когда важны ограничения производительности / памяти (что в основном означает всегда в каждой реальной программе, которую вы пишете).
Тем не менее, это опять-таки дискуссионный вопрос о том, насколько четко сформулированы требования и как часто ожидаются изменения кода. Например, в быстром и грязном инструменте или первоначальном прототипе, где несколько лишних байтов памяти и несколько миллисекунд потерянного времени не значат много, было бы хорошо иметь кучу (излишне) виртуальных функций ради гибкости.