В соответствии с https://en.cppreference.com/w/cpp/language/virtual#In_detail, перезаписывающими базовую virtual
функцию-член, заботятся только об имени функции, параметрах, const / volatile-ness и квалификаторе ref.Он не заботится о типе возвращаемого значения, модификаторе доступа или других вещах, о которых вы могли бы подумать.
Связанная ссылка также особо отмечает, что:
Base :: vf не обязательно должен быть видимым (может быть объявлен закрытым или унаследованным с использованием частного наследования) для переопределения.
Ничто из того, что я могу найти, не дает явного разрешения на это, но правила переопределения не мешают этому.Это допускается благодаря virtual
функциям и функциям, переопределяющим существующие и не запрещающим этот случай.
Если вы спрашиваете почему именно таков язык, вам, возможно, придется попросить стандартизациюкомитет.