Два похожих определения в Java и С++, но совершенно другое поведение.
Версия 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()
Версия на С++:
#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
.
Возможно, в С++ func2()
в базовом классе есть bind static
, но в Java это bind dynamic
?
Дел >
Поле участника статически включено.
Тип, выводящий часть, запутан.
Я думал, что this
преобразуется в тип base
в base::func1()
. В С++ base::func2()
не является полиморфизмом, поэтому вызывается base::func1()
.
Хотя в Java, base::func2()
является полиморфизмом, поэтому devried::func2()
вызывается.
Как предполагается, что привязка класса func2()
выводится? Или
Какой fun2()
должен быть вызван и как он определяется.
Что произошло за base::func1()
? Есть ли какой-либо листинг здесь для this
(от derive
до base
)?
Если нет, то как this
может достичь функции в классе base
?
void func1(){
func2();
}
Полезное обсуждение на coderanch.