Во-первых, изменив сигнатуру метода, вы создали новый метод, который будет скрывать базовый класс. Вам нужно, чтобы метод DerivedValidator validate () принимал только параметр Field *.
Затем, после того как вы добавили ключевое слово virtual в ваши методы, когда вы передали DerivedField, должен быть вызван правильный метод.
Вы по-прежнему не сможете получить доступ к унаследованным значениям DerivedField, поскольку вы ничего не сказали базовому классу о производном классе. то есть, Field знает все о типах Validator, но не имеет ни малейшего представления, что такое DerivedValidator. Все, к чему вы хотите получить доступ в производном классе, должно пройти через сигнатуру базового класса.