gpt4 book ai didi

java - 为什么在 Java 和 C++ 中不允许隐藏虚函数/方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:11 25 4
gpt4 key购买 nike

#include <iostream>
class A{
public:
void k(){
std::cout << "k from A";
}
};
class B:public A{
public:
int k(){
std::cout << "k from B";
return 0;
}
};
int main(){
B obj;
obj.k();

return 0;
}

没有 virtual 它工作正常,但是当我将 A 的函数更改为 virtual 然后它说返回类型应该相同,为什么?

我在 Java 中尝试过同样的事情:

class X{
public void k(){
System.out.println("k From X");
}
}
public class Y{
public int k(){
System.out.println("k From Y");
return 0;
}
}

当我在子类中尝试不同的返回类型时,Java 也显示错误。 (我认为因为默认情况下所有实例方法默认都是虚拟的)我期待 int k() 应该隐藏 void k()int k() 应该从 Y 的对象调用。

所以我认为这是虚拟的问题。为什么当函数声明为虚函数时,子类应该使用相同的返回类型?

如果是多态行为问题。然后我认为对象足以确定函数调用。

例子:

class X{
public void k(){
System.out.println("k From X");
}
}
public class Y extends X{
public int k(){
System.out.println("k From Y");
return 0;
}
public static void main(String[] args){
X obj=new Y();
obj.k(); // object Y found now just call k() from Y.
}
}

为什么我们不能在子类或子类中更改返回类型?

最佳答案

你猜对了,“多态”是关键词:)多态性意味着,如果 YX 的子类,则 Y 实际上 X,并且可以在任何地方用作 X

现在,这意味着,如果 X 有一个方法 void k(),那么 Y 也必须有相同的方法(否则,您将无法将其用作 X)。但是不能有两个具有相同签名的不同方法,因此 Y.k() 也必须返回 void(否则,它将是不同的方法)。

在 C++ 的情况下,非虚函数不是多态的:A.kB.k 在这种情况下是两种完全不同的方法,因此没有限制。

简而言之,让我们稍微改变一下您的示例:假设您定义了 X.k 以返回 int,而 Y.k() 作为 void。想象这样一个函数:

     int plusOne(X x) {
return x.k() + 1
}

这应该可以编译并工作,对吧?但是 plusOne(new Y()) 呢?这也必须有效,因为 YX ... 但是,如果 Y.k() 有可能返回一个 void,那么什么会plusOne 用它做什么?

关于java - 为什么在 Java 和 C++ 中不允许隐藏虚函数/方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35958755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com