Hallo!
[Quelltext]
Und genau hier habe ich ein Problem. Da Logging nun zwei mal in Application da ist, ist es nicht mehr eindeutig welche log Funktion aufgerufen werden soll.
Mein Frage ist wie löse ich dieses Problem? (Ich habe keine Möglichkeite die Logging und Daemon Klassen zu ändern!)
Zunächst mal kommst du an das log von Daemon grundsätzlich nicht mehr ran. Oder die private Vererbung ist ein Fehler in deinen Quellen.
Zur eigentlichen Frage: In der derzeitigen Vererbungshierarchie geht das gar nicht. Ich hatte selbst vor einiger Zeit dieses Problem (siehe /t/zugriff-auf-basisklasse-bei-mehrfachvererbung/603…
Du müßtest Logging über eine weitere Zwischenklasse in Application reinholen - such mal nach dem Stichwort „Diamant“, falls du es noch nicht kennst - und dann über den Scoping-Operator das jeweils passende aufrufen. Das Ganze ist dann aber IMHO sehr unschön.
Hier mal ein vereinfachtes Beispiel:
_struct Logging {
Logging() {}
void log() {}
};
struct Daemon : public Logging {
Daemon() : Logging() {}
int daemonize() {return 0;}
};
struct Blah : public Logging {
};
class Application : public Blah, public Daemon {
Application();
};
Application::Application() : Blah(), Daemon() {
Blah::log();
Daemon::log();
}_
Oder du benutzt, wie du selbst schon vorgeschlagen hast, eine Instanz von Logging innerhalb von Application. Für meinen Geschmack wäre das sauberer, aber ich kenne den Rest deines Programms nicht.
Gruß, Jan.