为什么子类中的重写方法隐藏了超类';s在C++;,但不是Java?
我注意到,在为什么子类中的重写方法隐藏了超类';s在C++;,但不是Java?,java,c++,inheritance,overriding,Java,C++,Inheritance,Overriding,我注意到,在Java中,如果重写子类中的方法,仍然可以调用仅在超类中被替换的被重写方法。但是在C++中,它将被隐藏 Java代码: class Fish { public void foo() {} } class Tuna extends Fish { public void foo(int i) {} } public class Test{ public static void main(String[] args) { Tuna t = new
Java
中,如果重写子类中的方法,仍然可以调用仅在超类中被替换的被重写方法。但是在C++
中,它将被隐藏
Java代码:
class Fish {
public void foo() {}
}
class Tuna extends Fish {
public void foo(int i) {}
}
public class Test{
public static void main(String[] args) {
Tuna t = new Tuna();
t.foo();
t.foo(1);
}
}
< > C++代码:
class Fish {
public:
void foo() {}
};
class Tuna : public Fish {
public:
void foo(int i) {}
};
int main() {
Tuna t;
t.foo(1); // ok
t.foo(); // error
return 0;
}
我注意到一些人在报告中给出了一些解释。如果这是真的
隐藏姓名将被证明是一种较小的罪恶
,为什么Java
选择了一种更邪恶的方法
为什么
Java
和C++
的行为不同?这仅仅是因为Java
和C++
之间的名称查找策略不同吗 我不知道这里是否有人能告诉你原因。也许只有詹姆斯·戈斯林能做到。但我马上发现了超载。如果你是一个有经验的Java程序员,这就不是问题。我建议从一个问题中去掉主观的和煽动性的术语,比如“邪恶”,使它更客观。这听起来有点像一只金枪鱼。为什么金枪鱼能喝水,而豹猫不能?java和C++是不一样的。为什么它们之间应该有任何特定的功能匹配?不同并不相同。