Это совершенно законно C ++. Вы просто определяете новый метод в классе Child.
Теперь он делает то, что вы хотите, это другой вопрос.
Я считаю, что режим доступа не является частью сигнатуры метода, что означает, что вызов виртуального метода Foo Base в конечном итоге вызывает метод Foo Child.
Итак, вот вывод: это законный c ++, и он работает так, как вы ожидаете.
Я не принимаю во внимание строку child.Foo();
, которая не может работать, потому что нет никаких сомнений в том, что она пытается получить доступ к детскому методу Foo ().