003
26.07.2003, 16:10 Uhr
Spacelord
Hoffnungsloser Fall
|
Da es ja offensichtlich ohnehin niemanden interessiert poste ich mal die Lösung. @ Oliver Müller: gut aus dem Bauch heraus entschieden. 3 von 4 Punkten
Der Compiler sucht die passende Methode nach dem most specific Ansatz aus. Der most specific Ansatz sucht in 2 Schritten die Methode die am besten passt.Das heisst die Methode deren formale Parametertypen am nächsten zu den aktuellen Parametertypen liegen.
1. Schritt: Gibt es eine Methode bei der die Typen der formalen Parameter exakt mit den aktuellen übereinstimmen wird diese ausgeführt.Ansonsten wird die Menge aller möglichen passenden Methoden bestimmt.Ist diese Menge einelementig wird diese Methode ausgeführt. Im Beispiel sind beim ersten Aufruf die Typen der aktuellen Parameter exakt passend. foo(a,d)-> foo(A* a,D* d) Beim zweiten Aufruf passen zwar die aktuellen Parameter für keine mögliche foo Funktion exakt aber die Menge der in Frage kommenden Funktionen enthält nur ein Element foo(c,a)->foo(B* b,A* a) Beim dritten Aufruf ist theoretisch jede Methode passend also wird Schritt 2 ausgeführt. Beim viertem Aufruf kommen die Methoden 1 und 2 in Frage also wird Schritt 2 ausgeführt.
2. Schritt: Hier wird unter den in Frage kommenden Methoden diejenige ausgesucht deren aktuelle Parametertypen,am "nächsten" zu den formalen Parametertypen liegen.
Im Beispiel: Aufruf 3: Typen der aktuellen Parameter C und E
Methode 1: foo(A* a,D* d) C ist ein B ist ein A = 2 "Sprünge" zum Supertypen E ist ein D =1"Sprung" zum Supertypen sind insgesammt 3 "Sprünge".
Methode 2: foo(B* b,A* a) C ist ein B = 1"Sprung" zum Supertypen E ist ein D ist ein A = 2 "Sprünge" zum Supertypen sind insgesammt 3 "Sprünge".
Methode 3: foo(C* c,D* d) C=C kein "Sprung" E ist ein D = 1 "Sprung" insgesammt 1 "Sprung"
also ist die dritte Methode in diesem Fall die speziellste und wird ausgeführt.
Aufruf 4: Typen der aktuellen Parameter B und D
Methode 1: foo(A* a,D* d) B ist ein A = 1 "Sprung" D=D kein "Sprung"
insgesammt 1 "Sprung"
Methode 2: foo(B* b,A* a) B=B kein "Sprung" D ist ein A = 1 "Sprung"
insgesammt 1 "Sprung" Also ist keine der beiden Methoden spezieller als die andere und der Compiler bricht mit einer Fehlermeldung ab!! Ohne Vererbung kann so eine Situation auch entstehen z.B. seien folgende beiden überladenen Funktionen deklariert:
void beispiel(int,int) und void beispiel(double,double) folgendes Codefragment bringt den Compiler in eine unentscheidbare Situation:
int i=0; double d =0; beispiel(i,d);
MfG Spacelord -- .....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes. |