Ответ 1
Потому что все методы в Java являются "виртуальными" (т.е. демонстрируют полиморфизм подтипов). С++ также запрещает конфликтующие типы возвращаемых данных при переопределении виртуальных функций-членов.
struct Base {
virtual void f() {}
};
struct Derived : Base {
int f() override { return 0; }
};
Выход компилятора:
8 : error: conflicting return type specified for 'virtual int Derived::f()'
int f() { return 0; }
^
3 : error: overriding 'virtual void Base::f()'
virtual void f() {}
^
Обратите внимание, что разрешены только конфликтующие типы возвращаемых данных. Доступны разные типы возврата, если они совместимы. Например, в С++:
struct Base {
virtual Base* f() { return nullptr; }
};
struct Derived : Base {
Derived* f() override { return nullptr; }
};
И в Java:
class Base {
Base f() { return null; }
}
class Derived extends Base {
@Override
Derived f() { return null; }
}