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

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 erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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