13. Februar 200916 j 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++.
13. Februar 200916 j 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]
13. Februar 200916 j Autor 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.
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.