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