为什么子类中的重写方法隐藏了超类';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++是不一样的。为什么它们之间应该有任何特定的功能匹配?不同并不相同。