【发布时间】:2015-06-17 06:12:39
【问题描述】:
Java 和 C++ 中的两个相似定义,但行为完全不同。
Java 版本:
class base{
public void func1(){
func2();
}
public void func2(){
System.out.println(" I am in base:func2() \n");
}
}
class derived extends base{
public void func1(){
super.func1();
}
public void func2(){
System.out.println(" I am in derived:func2() \n");
}
};
public class Test
{
public static void main(String[] args){
derived d = new derived();
d.func1();
}
}
输出:
I am in derived:func2()
C++ 版本:
#include <stdio.h>
class base
{
public:
void func1(){
func2();
}
void func2(){
printf(" I am in base:func2() \n");
}
};
class derived : public base
{
public:
void func1(){
base::func1();
}
void func2(){
printf(" I am in derived:func2() \n");
}
};
int main()
{
derived *d = new derived();
d->func1();
return 0;
}
输出:
I am in base:func2()
我不知道他们为什么会有不同的行为。
即使我知道 Java 具有自动多态行为。
Java 输出个人很难理解。
在我看来,根据static scope,基类函数func1()应该只能调用基类函数func2(),因为它根本不知道派生类。否则调用行为属于dynamic scope。
也许在 C++ 中,基类中的func2() 是绑定static,但在Java 中是绑定dynamic?
成员字段是静态作用域的。
类型推断部分令人困惑。
我以为this 在base::func1() 中转换为base 类型。在 C++ 中,base::func2() 不是多态性,因此会调用 base::func1()。
在 Java 中,base::func2() 是多态性,因此会调用 devried::func2()。
func2() 类绑定是如何被推断出来的?或者
应该调用哪个fun2() 以及如何确定。
base::func1() 背后发生了什么? this(从derive 到base)这里有演员吗?
如果不是,this 是如何访问base 类中的函数的?
void func1(){
func2();
}
Useful discussion 在 coderanch 上。
【问题讨论】:
-
很抱歉,这是我评论的最后一部分。我真的很想知道从
base::func1()调用func2()时类型推断是如何实现的。 -
你的意思是
func2()类绑定是如何被推断出来的? -
没错。应该调用哪个
fun2()以及如何确定。 -
扩展了我的答案。如果还不清楚,请告诉我。
-
你的扩展很棒。但是如果解释
base::func1()背后的事情会更有帮助。
标签: java c++ polymorphism overriding