java - 在 C++/Java 中隐藏还是重载?

标签 java c++ inheritance

这是我记得的:

在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 教程中,'hide' 实际上意味着其他东西(对于静态类方法),而对于实例方法,您可以重载从 base 继承的方法。看这个例子:Using inherited overloaded methods

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++ 中的“动态绑定(bind)”和“隐藏”思想,我会得到与调用 A 类中的“方法(Number n)”相同的结果,但是:

  1. 我仍然不确定如何用 Java 来解释它。该链接本身解释了使用“在编译时选择方法签名”和“它实际上是从 B 类调用”;但是在C++的思路上,前者是可以的,但我觉得不是B类调用,应该是A类调用吧?

  2. Using inherited overloaded methods和 Java 教程,允许“B 类”重载“A 类”的函数,而“B 类”实际上可以看到两者“方法(Number n)”和“方法(整数 d)” .所以 C++ 和 Java 对待重载的方式不同,对吧?为什么是这样?在 C++ 示例中,如果 Derived 也允许重载,“d->f(65.3)”将调用“f(double x)”,而不是“f(char c)”。

谢谢,

最佳答案

在 C++ 中,非虚函数的所有事物都是静态的,因此对于非虚函数,您没有动态绑定(bind)。隐藏不会从继承中删除功能。它是这样的:

当您将方法 M 定义为:void M(int) 然后编译器在内部实现一个函数,将 Base::M 命名为 void Base::M( Base* this, int )。现在这个函数是在代码中的某个地方实现的,不能删除,只要你能提供一个 this 就可以调用它(实际上你甚至可以在没有 this 的情况下调用它)。所以在 Child 中我可以调用 Base::M(0); 并且 C++ 将 thisChild* 转换为Base* 并调用 M。当您定义一个名称与基类名称相对应的函数时,您告诉编译器我更喜欢在我的类中使用该名称作为新方法或属性!但是你不删除任何东西,你可以使用 usingM 的旧定义带给 Child:

struct Base {
    void f( int ) {}
};
struct Child : Base {
    void f( char* ) {}
    using Base::f;  // Bring Base::f to this class, so I have f(char*), f(int)
};

除此之外,您甚至可以在不使用 using 的情况下调用 f(int)

// In the Child class
void test() {
    Base::f('c');  // Call Base::f(char)
}

// Outside of class
Child c;
((Base*)&c)->f('1');

关于java - 在 C++/Java 中隐藏还是重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12870336/

相关文章:

java - hashmap 如何识别何时需要重新哈希

java - Java ByteArray 中跳过字节

java - Visual C++ 错误 : LNK2019, LNK2028 和 LNK1120

C++ 纯虚多重继承?

javascript - 为每个类单独继承静态成员

java - SQLite 数据库未更新

java - Google App Engine 上的 Spring Security openid

c++ - CritSec.h 不存在 (Win 8.1)

c++ - GtkVBox Qt 等价物

javascript - 使用模块加载和类继承将 ES6 转换为 ES5