#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;
}
没有虚拟的情况下,它工作正常,但是当我将A
函数更改为虚拟时,这就是说返回类型应该为什么相同?
我在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.
}
}
为什么我们不能在子类或子类中更改返回类型?
您猜对了,“多态”是关键字:)多态意味着,如果Y
是的子类X
,则Y
有效地是 X
,并且可以在X
任何地方使用。
现在,这意味着,如果X
具有method void k()
,那么Y
还必须具有相同的方法(否则,您将无法使用X
)。但是您不能有两个具有相同签名的不同方法,因此也Y.k()
必须返回void
(否则,它将是一个不同的方法)。
在C ++情况下,非虚函数不是多态的:A.k
并且B.k
在这种情况下是两种完全不同的方法,因此没有限制。
简而言之,让我们稍微更改一下示例:假设您定义X.k
了returnint
和Y.k()
as void
。想象一下这样的函数:
int plusOne(X x) {
return x.k() + 1
}
这样可以编译工作,对吗?但是呢plusOne(new Y())
?这也必须起作用,因为Y
是X
...,但是,如果有可能Y.k()
返回一个空值,该怎么plusOne
办?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句