Два похожих определения в 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.