Java 中的函数重写与C++
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输出很难理解。
在我看来,根据静态作用域
,基类函数 func1()
应该只能调用基类函数 func2(),
因为它对派生类一无所知。否则,调用行为属于动态范围
。也许在C++中,基类中的func2()
是绑定静态
的,但在Java中它是绑定动态的
?
成员字段是静态范围的。
类型推断部分令人困惑。我以为是转换为键入.在C++中,不是多态性,所以被称为。而在Java中,是多态性,所以被称为。this
base
base::func1()
base::func2()
base::func1()
base::func2()
devried::func2()
如何推断类绑定?或者应该调用哪个以及如何确定它。func2()
fun2()
后面发生了什么?这里有没有(从到)的演员?如果不是,如何能够在课堂上达到函数?base::func1()
this
derive
base
this
base
void func1(){
func2();
}
关于代码ranch的有用讨论。