Due definizioni simili in Java e C++, ma un comportamento completamente diverso. VersioneOverride delle funzioni in Java vs 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();
}
}
uscita:
I am in derived:func2()
C++ versione:
#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;
}
uscita:
I am in base:func2()
Non so perché hanno un comportamento diverso.
Anche io so che Java ha un comportamento auto polimorfismo.
L'output Java è difficile da comprendere personalmente.
A mio avviso, in base alla static scope
, la funzione di classe di base func1()
dovrebbe essere solo in grado di chiamare la funzione della classe base func2()
, in quanto non sa nulla della classe derivata a tutti. In caso contrario, il comportamento di chiamata appartiene a dynamic scope
. Forse in C++, func2()
nella classe base è bind static
, ma in Java è dynamic
vincolante?
Il campo membro è a livello di ambito.
Il tipo inferenza parte è confusa. Ho pensato che il this
sia stato convertito nel tipo base
nello base::func1()
. In C++, il base::func2()
non è polimorfismo, quindi viene chiamato il base::func1()
. Mentre in Java, base::func2()
è il polimorfismo, viene chiamato devried::func2()
.
Come viene dedotta la legatura della classe func2()
? O Quale fun2()
dovrebbe essere chiamato e come viene determinato.
Che cosa è successo dopo base::func1()
? C'è un getto qui per this
(da derive
a base
)? Se no, come this
è in grado di raggiungere la funzione nella classe base
?
void func1(){
func2();
}
Useful discussion su coderanch.
Mi dispiace, ma è l'ultima parte del mio commento. Voglio davvero sapere come viene implementata l'inferenza di tipo quando si chiama 'func2()' da 'base :: func1()'. – Kamel
Intendi * Come viene inferta l'associazione di classe 'func2()'? * – aioobe
Esatto. Quale 'fun2()' dovrebbe essere chiamato e come viene determinato. – Kamel