我从2000年开始用Java编程,而自1987年开始用C ++编写。因此,大多数时候我都能很容易地掌握Java概念,并且很容易通过C ++知识来帮助它。但在某些情况下,它给了我一种“文化”的冲击(对于一个根深蒂固的C ++文化的人来说)。如果我在C ++中有以下程序:
// override.cpp
class Base
{
public:
void f(int) { }
};
class Derived : public Base
{
public:
void f(char *) { }
};
int main()
{
Derived d;
d.f(5); // This line throws a compilation error
}
通过Derived对象调用f(5)会抛出错误,因为在Derived类的范围内,f()只能接受一个字符指针。如果我将这个程序翻译成Java:
// Override.java
class Base
{
public void f(int i) { System.out.println("Base.f()"); }
}
class Derived extends Base
{
public void f(String s) { System.out.println("derived.f()"); }
public static void main(String [] args)
{
Derived d = new Derived();
d.f(5);
}
}
编译器不会抛出任何错误,程序会产生输出:
Base.f()
这显然具有误导性。我是否应该在调用Derived范围内不可用的函数时遇到编译错误?
答案 0 :(得分:1)
重写方法必须具有相同的参数列表。
如果没有,那么函数就可以作为重载函数
在上面的例子中,您的基类函数在d.f(5);
调用时匹配。
答案 1 :(得分:0)
在java中,public void f(int i)
等非私有成员将由子类继承,这意味着它将是子类的方法成员,因此
public void f(String s)
public void f(int i)
可在子类中访问。
答案 2 :(得分:0)
在C ++中,它默认不搜索基类来调用函数/方法。在您的情况下,您需要通过关键字python ensemble_plsr.py example_settings.txt
(例如using
)明确指定相同内容。但是在Java的情况下,默认情况下会这样做.using语句将重载函数带入同一范围,以便它可以参与重载决策。下面的C ++代码对我来说很好。所以区别仅在于默认行为。
using Base::f;
答案 3 :(得分:0)
所有公共函数都可以从类及其所有基类中获得(一直到Object.class
)。这里的关键是实例的声明类型。例如:
Base b = new Derived();
b.f(10); // prints Base.f()
b.f("foo"); // does not compile
Derived d = new Derived();
d.f(10); // prints Base.f()
d.f("foo"); // prints derived.f()
即使b的运行时类型为Derived.class
,声明的类型为Base.class
。您会看到与接口相同的行为:
List list = new ArrayList();
您只能访问List
中声明的方法,而不能访问ArrayList
中的所有方法。