В общем случае, вам следует делать методы виртуальным. Ис-
пользуйте статические методы только в том случае, если вы хотите
получить оптимальную эффективность скорости выполнения и исполь-
зования памяти. Однако в этом случае, как вы видели, вы теряете
возможности расширения.
Предположим, что вы описываете объект с именем Ancestor и
внутри этого объекта вы описываете метод с именем Action. Как вы
определяете, каким должен быть метод, виртуальным или статичес-
ким? Здесь приводится правило большого пальца: сделайте метод
Action виртуальным, если имеется вероятность, что будущие наслед-
ники объекта Ancestor будут переопределять Action, а вы хотите,
чтобы будущий код был доступен Ancestor.
С другой стороны, помните, что если у объекта имеются любые
виртуальные методы, то для этого объекта в сегменте данных будет
создана таблица виртуальных методов (ТВМ) и каждый экземпляр это-
го объекта будет иметь связь с ТВМ. Каждый вызов виртуального ме-
тода должен проходить через ТВМ, тогда как статические методы вы-
зываются непосредственно. Хотя просмотр ТВМ является весьма эф-
фективным, вызов статического метода все равно остается немного
более быстрым, чем вызов виртуального. И если в вашем объекте нет
виртуальных методов, то и ТВМ отсутствует в сегменте данных и
(что более важно) в каждом экземпляре объекта отсутствуют связи с
ТВМ.
Дополнительная скорость и эффективное использование памяти
для статических методов должно уравновешиваться гибкостью, кото-
рую допускают виртуальные методы: вы можете расширить имеющийся
код спустя много времени после его компиляции. Помните, что поль-
зователь вашего типа объекта может рассматривать пути его исполь-
зования, которые вам и не снились, что, в конечном счете, имеет
основное значение.