Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

C++ Interfacemethode überladen

Empfohlene Antworten

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

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]

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.