С++ и Java поддерживают ковариацию возвращаемого типа при переопределении методов.
Тем не менее, поддерживайте contra-variance в типах параметров - вместо этого он переводит на более загрузку (Java) или скрывает (С++).
Почему это? Мне кажется, что в этом нет вреда. Я могу найти одну причину для этого в Java - поскольку в любом случае он имеет механизм "выбрать наиболее специфичную версию" для перегрузки, но не может думать о какой-либо причине для С++.
Пример (Java):
class A {
public void f(String s) {...}
}
class B extends A {
public void f(Object o) {...} // Why doesn't this override A.f?
}