这是我记得的:
在 C++ 中,如果派生类定义了一个与基类具有相同名称但签名(参数等)不同的成员函数,它将在基类中“隐藏”相应的成员函数。例如
class Base {
public:
void virtual f(double x);
};
class Derived : public Base {
public:
void f(char c);
};
int main()
{
Derived* d = new Derived();
Base* b = d;
b->f(65.3); // call f(double x)
d->f(65.3); // call f(char c)
delete d;
return 0;
}
如果我错了,请纠正我,但我认为在 C++ 中说“隐藏”,这也意味着派生类看不到“f(double x)”,或者换句话说,派生类没有“f(double x)”作为它从 Base 继承的成员函数,对吗?
在 Java 教程中,“隐藏”实际上意味着其他东西(对于静态类方法),而对于实例方法,您可以重载从基类继承的方法。看这个例子:使用继承的重载方法
public class ClassA {
public void method(Number n) {
System.out.println("ClassA: " + n + " " + n.getClass());
}
}
public class ClassB extends ClassA {
public void method(Integer d) {
System.out.println("ClassB: " + d + " " + d.getClass());
}
}
ClassA a = new ClassB();
a.method(3);
在 C++ 类型的思维中,基于 C++ 中的“动态绑定”和“隐藏”思想,我会得到与调用 A 类的“方法(编号 n)”相同的结果,但是:
我仍然不确定如何用 Java 解释它。该链接本身使用“在编译时选择方法签名”和“它实际上是从 B 类调用”来解释;但是在 C++ 的思想中,前者是可以的,但我不认为它是从 B 类调用的,它应该是从 A 类调用的,对吧?
在使用继承的重载方法和Java教程中,'Class B'允许从'Class A'重载函数,并且'Class B'实际上可以看到'method(Number n)'和'method(Integer d)'。所以 C++ 和 Java 对待重载的方式不同,对吧?为什么是这样?在 C++ 示例中说,如果 Derived 也允许重载,则 'd->f(65.3)' 将调用 'f(double x)',而不是 'f(char c)'。
谢谢,