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