我们知道重载对C ++中的派生类不起作用。但为什么这种行为在java中有所不同?意味着为什么重载适用于java中的派生类? 请考虑以下Stroustrup博士的常见问题解答中的示例
#include <iostream>
using namespace std;
class Base
{
public:
int f(int i)
{
cout << "f(int): ";
return i+3;
}
};
class Derived : public Base
{
public:
double f(double d)
{
cout << "f(double): ";
return d+3.3;
}
};
int main()
{
Derived* dp = new Derived;
cout << dp->f(3) << '\n';
cout << dp->f(3.3) << '\n';
delete dp;
return 0;
}
该程序的输出是:
f(双):6.3
f(双):6.6
而不是假定的输出:
f(int):6
f(双):6.6
但如果我们在java中执行此程序,则输出会有所不同。
class Base
{
public int f(int i)
{
System.out.print("f (int): ");
return i+3;
}
}
class Derived extends Base
{
public double f(double i)
{
System.out.print("f (double) : ");
return i + 3.3;
}
}
class Test
{
public static void main(String args[])
{
Derived obj = new Derived();
System.out.println(obj.f(3));
System.out.println(obj.f(3.3));
}
}
答案 0 :(得分:7)
它的工作原理是因为Java语言规范在§8.4.9. Overloading中明确允许它:
如果一个类的两个方法(无论是在同一个类中声明,还是由一个类继承,或一个声明的和一个继承的)具有相同的名称,但签名不是覆盖 - 相当于,然后方法名称被称为重载。
另见§15.12.2. Compile-Time Step 2: Determine Method Signature。
答案 1 :(得分:7)
您已经说过&#34;我们知道重载不适用于派生 C ++中的类&#34; 。
这不是真的或准确的句子。您可以在C ++中跨基类和派生类重载。只需要using
将父方法导入到派生类中,即可取消隐藏该方法。
class Derived : public Base
{
public:
using Base::f;
^^^^^^^^^^^^^^
double f(double d) { ... }
};
派生类中的Java重载(同名)方法并不隐藏其父方法,并且您不需要从父方法中明确地引入它。