FinalFantasy Geschrieben 13. Februar 2009 Geschrieben 13. Februar 2009 Hi, ich habe hier gerade ein kleines Konstrukt zustande gebracht, bei dem ich nicht verstehe, wieso es nicht funktioniert. Das Ausgangskonstrukt war so: class Interface { public: virtual void load(DomNode node) = 0; virtual void save(DomNode node) = 0; } class A : public Interface { public: virtual void load(DomNode node) { MACH WAS }; virtual void save(DomNode node) { MACH WAS }; } [/PHP] Aber da Programmierer ja faul sind, wollte ich mein Interface um eine Methode erweitern, die mir das Laden direkt aus einer Datei erlaubt. Also so: [PHP] class Interface { public: virtual void load(DomNode node) = 0; virtual void save(DomNode node) = 0; void load(String Dateiname) { File file(Dateiname); if(file.open()) { DomDocument doc(file.readAll()); load(doc.rootElement()); } } } Damit habe ich die load-Methode ja überladen, auch wenn eine virtuell abstrakt ist. (Ich habe schon versucht, die zweite load-Methode auch virtuell zu machen, obwohl das nicht nötig wäre, bringt aber auch keine Besserung) Was ich jetzt NICHT funktioniert: A a; a.load("test.xml"); [/PHP] Fehlermeldung: const char[] kann nicht in DomNode konvertiert werden. Folgendes Konstrukt klappt aber: [PHP] A a; Interface* if = dynamic_cast<Interface*>(&a); if->load("test.xml"); Wieso ist die load(string)-Methode in der abgeleiteten Klasse nicht verfügbar? Wenn ich die load(string)-Methode im Interface allerdings loadFromFile() nenne (und damit die Methode nicht mehr überlade), klappt es auch wie es soll. Ist übrigens alles Pseudocode aber wie gesagt, es handelt sich um C++.
Klotzkopp Geschrieben 13. Februar 2009 Geschrieben 13. Februar 2009 Die Suche nach Überladungen geht in C++ nicht über Vererbungsbeziehungen hinweg. Wenn in A eine Methode mit passendem Namen vorhanden ist, werden Basisklassen nicht weiter nach Überladungen durchsucht. Das kannst du durch eine using-Deklaration umgehen: class A : public Interface { using Interface::load; // ...[/code]
FinalFantasy Geschrieben 13. Februar 2009 Autor Geschrieben 13. Februar 2009 Hm, ich hab es schon befürchtet, dass es so ist. :upps Das mit using funktioniert aber, habs ausprobiert :cool:. Allerdings für meinen Fall eher unpraktikabel, aber trotzdem danke für den Hinweis, wieder was dazugelernt.
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden