#include <iostream>
class A{
public:
void k(){
std::cout << "k from A";
}
};
class B:public A{
public:
int k(){
std::cout << "k from B";
return 0;
}
};
int main(){
B obj;
obj.k();
return 0;
}
Я пробовал то же самое в Java.Почему скрытие виртуальных функций/методов не разрешено в Java или C++
class X{
public void k(){
System.out.println("k From X");
}
}
public class Y{
public int k(){
System.out.println("k From Y");
return 0;
}
}
Java также показывает ошибку, когда я пробовал использовать другой тип возврата в подклассе. (Я думаю, потому что по умолчанию все методы экземпляра по умолчанию являются виртуальными). Я ожидал, что int k()
должен скрыть void k()
и int k()
должен вызывать объект Y.
Так что я думаю, что это проблема с виртуальным. почему дочерний класс должен использовать тот же тип возврата, если функция объявлена как виртуальная?
Если это проблема полиморфного поведения. Тогда я думаю, что объекта достаточно, чтобы определить вызов функции. Пример:
class X{
public void k(){
System.out.println("k From X");
}
}
public class Y extends X{
public int k(){
System.out.println("k From Y");
return 0;
}
public static void main(String[] args){
X obj=new Y();
obj.k(); // object Y found now just call k() from Y.
}
}
Может ли какой-либо орган объяснить? почему мы не можем изменить тип возвращаемого значения в подклассе или дочернем классе?
Int к и ничтожной к не имеют один и тот же метод подписи? –
@Yassin Мой последний пример также показывает ошибку в Eclips. – UnKnown
@UnKnown Поскольку, если вы собираетесь переопределить, вы должны сохранить одну и ту же подпись. Если вы хотите перегрузить, список параметров должен отличаться. –