Одной из распространенных причин является использование стандартной обработки вокруг абстрактного метода. Например, возможно, абстрактный метод может быть вызван только при определенных обстоятельствах - скажем, после того, как сплайны были повторены. В этом случае имеет смысл проверять _areSplinesReticulated в одном месте - публичном методе GetSomething - вместо того, чтобы требовать от каждой реализации абстрактного метода выполнения своей собственной проверки. Или, может быть, GetSomething на 90% стандартен, но требует немного дополнительной логики или важной информации, которую могут предоставить только производные классы.
Это форма шаблона Template pattern.
Не виртуальный GetSomething означает, что каждый производный класс получает стандартную обработку и получает возможность участвовать только через свою пользовательскую версию DoGetSomething. Если GetSomething является виртуальным, это означает, что производные классы могут обходить стандартную обработку, если они этого хотят. Любая из этих стратегий является жизнеспособной в зависимости от того, является ли стандартная обработка GetSomething неотъемлемой частью логики класса (например, инварианты), или же базовый класс хочет предоставить максимальную гибкость производным классам.