но получается что для правильного наследования (а приоритет метода в Derived class это правильное наследование) необходимо чтоб в базовом классе было это прописано явно. А разработчик не может предугадать как будут реализованы наследники когда пишет базовый класс.
Это не нужно предугадывать. Разработчик наследуемого класса видит, что виртуальное и что нет, и решает, подходят ли реализации из базы (если не чисто виртуальный метод) и нужно ли переопределять