ueberladen virtueller methoden...?
-
class base { public: virtual void r( int a ) = 0; virtual void r( int a, double d ); }; void base::r( int a, double d ) { } class derived : public base { public: virtual void r( int a ); // nur wenn r in der unterklasse redefiniert wird ist es sichtbar...? //virtual void r( int a, double d ) { base::r( a, d ); } }; void derived ::r( int a ) { } int main() { derived a; a.r( 1 ); a.r( 1, 2 ); // nur compilierbar wenn oben die methode auskommentiert ist. warum?! }
warum muss ich um r(int,double) aufrufen zu koennen, sie
in der abgeleiteten klasse ueberschreiben??
-
Musst du doch gar nicht. Aber dann kannst du sie halt auch nicht aufrufen, weil es kein derived::r(a, d) gibt. Die Methode der Basisklasse wird nur aufgerufen, wenn du dynamisch bindest, aber da du keine Indirektion hast (du arbeitest direkt mit dem Objekt und nicht über eine Referenz), gibts nichts dynamisch zu binden, weil der Typ feststeht und die explizit mit dem Typ derived arbeitest.
-
Edit: Uhje viel zu spät...
MfG SideWinder
-
folgendes beispiel klappt auch nicht:
int main() { derived* a = new derived; a->r( 1 ); a->r( 1, 2 ); }
ich verstehe nicht wieso. derived erbt ja oeffentlich von base.
also muss derived auch eine methode r( int, double ) haben
(ohne dass ich es extra in derived implementieren muss).
oder sehe ich das falsch?ich habe beide beispiele auf dem g++ 3.2.3 und dem vc++.net (7.0)
versucht zu uebersetzen. immer das selbe.
beide melden, dass es keine methode r(int,double) gibt, die
beste uebereinstimmung sei r(int).
erst wenn ich die methode in derived auskommentiere gehts.g++ version 3.2.3, Fehlermeldung t.cpp: In function `int main()': t.cpp:30: no matching function for call to `derived::r(int, int)' t.cpp:22: candidates are: virtual void derived::r(int)
ich hab ein paar fehler aus dem beispiel oben korrigiert... (was nichts
mit dem problem ansich zu tun hat).
-
Es klappt wenn du
a->base::r( 1, 2.0 );
machst, über den Grund bin ich mir nicht ganz sicher. Ich glaube aber es liegt daran, dass die Methode derived::r(int) die Methode base::r(int,double) verdeckt und somit nicht direkt aufgerufen werden kann.
-
Versuch mal ein
using base::r;
in den public Bereich von derived zu packen.
-
Überladen funktioniert nicht über Vererbungsgrenzen hinweg. Sobald der Compiler eine Funktion gefunden hat, die dem Namen nach passt, werden die Basisklassen nicht weiter durchsucht, auch wenn danach die Zuordnung der Parameter fehlschlägt.
Eine using-Deklaration in der abgeleiteten Klasse sollte helfen:
class derived : public base { using base::r; // ... };
-
Hallo,
schau mal auf meine Seite:
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=Overload#Answund in unsere FAQ:
http://www.c-plusplus.net/forum/viewtopic.php?t=39496&highlight=�berladen
-
aso!
ja, danke jetzt hab ichs geschnallt...