Zwei ähnliche Definitionen in Java und C++, aber völlig anderes Verhalten.Funktion überschreiben in Java vs C++
Java-Version:
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();
}
}
Ausgang:
I am in derived:func2()
C++ Version:
#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;
}
Ausgang:
I am in base:func2()
Ich weiß nicht, warum sie ein unterschiedliches Verhalten haben.
Selbst ich weiß, dass Java Auto-Polymorphie-Verhalten hat.
Die Java-Ausgabe ist persönlich schwer zu verstehen.
Meiner Ansicht nach static scope
kann die Funktion der Basisklasse func1()
sollte nur in der Lage, die Funktion der Basisklasse func2()
zu nennen, wie es überhaupt nichts von der abgeleiteten Klasse kennt. Ansonsten gehört das aufrufende Verhalten zu dynamic scope
. Vielleicht in C++, func2()
in der Basisklasse ist bind static
, aber in Java ist es bind dynamic
?
Mitgliederfeld ist statisch begrenzt.
Der Typ Schlussfolgerung ist verwirrend. Ich dachte this
wird in base
Typ in umgewandelt. In C++ ist die base::func2()
kein Polymorphismus, daher wird die genannt. Während in Java base::func2()
Polymorphismus ist, wird devried::func2()
genannt.
Wie wird die func2()
Klassenbindung abgeleitet? Oder Welches fun2()
sollte aufgerufen werden und wie es bestimmt wird.
Was ist hinter passiert? Gibt es hier eine Besetzung für this
(von derive
bis base
)? Wenn nein, wie kann this
die Funktion in base
Klasse erreichen?
void func1(){
func2();
}
Useful discussion auf coderanch.
Es tut mir leid, aber es ist der letzte Teil meines Kommentars. Ich möchte wirklich wissen, wie die Typinferenz implementiert wird, wenn 'func2()' von 'base :: func1()' aufgerufen wird. – Kamel
Meinst du * Wie die 'func2()' Klassenbindung abgeleitet wird? * – aioobe
Genau. Welches 'fun2()' aufgerufen werden soll und wie es bestimmt wird. – Kamel