C ++:
Вы имеете в виду имя, скрывающее в C ++.Если у вас есть класс с переопределенными методами, и вы расширяете этот класс переопределением одного из переопределенных методов, вам необходимо переопределить все перегруженные методы.В противном случае вызовы не переопределенных перегруженных в расширенном классе не будут работать.
Например:
class Base {
public:
virtual void A (int);
virtual void A (int, int);
};
void Base::A(int i) {
std::cout << “Hi\n”;
}
void Base::A (int i, int j) {
std::cout << “Bye!!\n”;
}
Предположим, вы переопределяете только один из методов:
class Sub: public Base {
public:
void A(int);
};
void Sub::A(int i) {
std::cout << “Hey, La!\n”;
}
void main () {
Sub a;
a.A(1);
a.A(1, 1);//won't compile
}
Второй вызов не будет работать, так как A(int, int)
не виден.Это имя скрывается.Если вы хотите обойти это, вы можете использовать ключевое слово using
следующим образом:
class Sub: public Base {
public:
void A(int);
using Base::A;
};
void Sub::A(int i) {
std::cout << “Hey, La!\n”;
}
void main () {
Sub a;
a.A(1);
a.A(1, 1);//will compile
}
Java:
В Java такого понятия нет,Вы можете попробовать это сами.Обратите внимание, что все методы Java являются виртуальными по умолчанию в соответствии с виртуальными методами C ++.
public class Base {
public void A() {
System.out.println("Hi");
}
public void A(int i, int j) {
System.out.println("Bye");
}
}
public class Sub extends Base {
public void A() {
System.out.println("Hey, La!");
}
}
public class Test {
public static void main(String[] args) {
Sub a = new Sub();
a.A();
a.A(1, 1);//perfectly fine
}
}
В стороне:
Надеюсь, вы не имеете в виду расширение абстрактного класса- если вы расширяете абстрактный класс, вам нужно переопределить все абстрактные методы, иначе ваш класс должен быть объявлен как абстрактный.
Хотя все методы реализованного интерфейса должны быть реализованы.