Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Vererbung+Überladung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
20.07.2003, 13:01 Uhr
Spacelord
Hoffnungsloser Fall


Hi,
ich setz jetzt auch mal ne Aufgabe,für fortgeschrittene Anfäger,rein.
Der folgende Code sollte lediglich theoretisch durchgearbeitet werden.
Also zum lösen der Aufgabe nicht kompilieren und ausführen.

C++:

class A
{
};

class B:public A
{
};

class C:public B
{
};

class D:public A
{
};

class E:public D
{
};

class Overload
{
    public:
        void foo(A* a,D* d){};  // Nr.1
        void foo(B* b,A* a){};  // Nr.2
        void foo(C* c,D* d){};  // Nr.3
};


int main()
{
    Overload* myOver= new Overload();
    A* a=new A();
    B* b=new B();
    C* c=new C();
    D* d=new D();
    E* e=new E();

    myOver->foo(a,d);
    myOver->foo(c,a);
    myOver->foo(c,e);
    myOver->foo(b,d);

    return 0;
}




Die Frage ist einfach welche foo Methode aus Overload bei den Aufrufen in main ausgeführt wird und vor allem wieso?!

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.07.2003, 13:41 Uhr
Oliver
S2-Pixelgeneral


Iiii, Theorie

Aber ich versuchs mal (hoffentlich plamier ich mich jetzt nicht )

Also wolln wir mal:

1. Da sollte Nr1 aufgerufen werden, weil ja a und d übergeben werden, ganz logisch.

2. Da sollte Nummero 2 aufgerufen werden, weil ja c von b abgeleitet ist und a ist ja schon da

3. Da sollte Nummer 3 aufgerufen werden, weil c ja schon da ist und e ist ja von d abgeleitet (also wäre das auch geklärt)

4. Da wird Nummer 1 aufgerufen, weil b von a abgeleitet ist und da ist auch wieder schon da.

Ich hoffe ich die Begründung einigermaßen verständlich geschrieben ...
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.07.2003, 15:14 Uhr
Spacelord
Hoffnungsloser Fall


Warum wählst du beim dritten Aufruf die dritte Methode?
Theoretisch wäre doch jede Methode passend.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
26.07.2003, 17:39 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Da es ja offensichtlich ohnehin niemanden interessiert poste ich mal die Lösung


Also ich fands ganz nett auch wenn ich nicht mitgespielt habe. Auf jeden fall hab ich was dazugelernt, weil ich mich mit Spezialisierung noch gar nicht beschäftigt habe.

Sowas sollte dich nicht abbringen weitere Rätsel zu stellen.
Ist ja sonst recht trist in diesem forum weil beefy und ich fast die einzigen sind die rätsel stellen. virtual scheint gerade ne pause einzulegen.
Allerdings mag ich persönlich Rätsel wo ich was implementieren muss lieber.

Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: