FinalFantasy Geschrieben 13. Februar 2009 Teilen 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++. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 13. Februar 2009 Teilen 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] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
FinalFantasy Geschrieben 13. Februar 2009 Autor Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.