Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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++.

Geschrieben

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]

Geschrieben

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. :D

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...