Zugriff auf Basisklasse bei Mehrfachvererbung

Hallo!

Mein Problem ist eine Mehrfachvererbung mit gemeinsamer Basisklasse, allerdings nicht der klassische Diamant. Eine Seite erbt direkt von der Basisklasse, auf der anderen hängt noch eine Klasse dazwischen. Ich denke ein Beispiel verdeutlicht das am besten:

class Base {
protected:
 int a;
}

class Dev : public Base {};

class Join : public Base, public Dev {
...
// Zugriff auf direkt von Base geerbtes a?
...
};

oder grafisch

 Base
 | \
 | \
 | Dev
 | /
 | /
 Join

Jede Instanz der Klasse ‚Join‘ enthält insgesamt 2 Instanzen von ‚Base‘, was auch so beabsichtigt ist. Nur, wie erkläre ich dem Compiler welche der beiden Instanzen ich ansprechen möchte? Ein ‚Base::a‘ ist ja leider auch nicht eindeutig, genauso wenig wie Casts.

Ich befürchte inzwischen die Struktur nochmal komplett über den Haufen werfen zu müssen, weil es schlicht nicht geht…

Alternative: Join benutzt Base

Base
^
|
|
Derived
^
|
|
Join —> Base

Code-Beispiel:

class Base
{
public:
Base() : s(„Hello“) { }
void set_s(const std::string& _s) { s=_s; }
std::string get_s() const { return s; }
protected:
std::string s;
};

class Derived : public Base
{
};

class Join : public Derived
{
private:
Base base;
friend std::ostream& operator

Alternative: Join benutzt Base

An so eine Konstruktion hatte ich auch schon gedacht. Nur brauche ich dann für alle Methoden von ‚Base‘ in ‚Join‘ nochmal eine Implementierung, die alle Anfragen „durchreicht“ und natürlich kann ich ‚Join‘ dann auch nicht mehr einfach auf ‚Base‘ casten.

Wie meinst du das Join nach Base casten?
Du meinst wahrscheinlich die Zuweisung der Adresse des abgeleiteten Typs an den Zeiger des Basistyps:

Join j;
Base* b = &j;

Das funktionert!!!
Aber erinnern wir uns noch einmal an dein Anfangsproblem: Mehrdeutigkeit. Dies lässt sich nicht anders lösen. Wenn man darüber nachdenkt und um bei meinem Beipiel zu bleiben: wenn Join direkt von Base erben würde (und indirekt von Base über Derived) welches get_s/set_s sollte denn über ein Join Objekt aufgerufen werden? get_s/set_s von Derived oder das von Base? Oder vielleicht beide nach einander…:wink:

Wie meinst du das Join nach Base casten?
Du meinst wahrscheinlich die Zuweisung der Adresse des
abgeleiteten Typs an den Zeiger des Basistyps:

Genau. Oder ein ‚Join‘ anstelle eines ‚Base‘ an eine Funktion übergeben.

Das funktionert!!!

Hmm, stimmt. Aber eben nur mit der einen Instanz von ‚Base‘ die dann über die Vererbung reinkommt.

Aber erinnern wir uns noch einmal an dein Anfangsproblem:
Mehrdeutigkeit. Dies lässt sich nicht anders lösen.

OK, danke! Ich hatte es ja schon befürchtet :-/
Da werd’ ich das wohl wirklich nochmal umstellen müssen.

welches get_s/set_s sollte denn über ein Join Objekt

aufgerufen werden? get_s/set_s von Derived oder das von Base?

Oder vielleicht beide nach einander…:wink:

Genau das hätte ich eben gerne auswählen wollen. Wäre ja möglich gewesen, daß es da eine Möglichkeit mit dem scope-Operator (::smile: gibt, um eine unmittelbare Elternklasse anzusprechen.