Xin hat geschrieben:Wie man hier sieht, ignoriert VisualStudio zum einen das using left::getValue
Also bei mir macht das using Left::getValue auch keinen Unterschied (g++).
Xin hat geschrieben:Left wie Right sind von Base abgeleitet und durch die Mehrfachvererbung gibt es nun zwei unterschiedliche Bases und entsprechend zwei unterschiedliche Values, die ja auch unterschiedlich sein könnten.
Ich habe dein Beispiel mal modifizert und der Base-Klasse zusätzlich einen Setter gegeben (zum Testen).
Code: Alles auswählen
#include <stdio.h>
class Base {
int Value;
public:
Base( int value ) : Value(value) {}
int getValue() { return Value; }
void setValue(int val) { Value = val; }
};
class Left : public Base {
public:
Left( int value ) : Base( value ) {}
};
class Right : public Base {
public:
Right( int value ) : Base( value ) {}
};
class Derived : public Left, public Right {
public:
Derived( int value )
: Left(value)
, Right(value)
{}
int getValue() {
return Left::getValue();
}
void setValue(int val) {
Left::setValue(val);
Right::setValue(val);
}
};
int main( void ) {
Derived d( 1 );
printf( "%d\n", d.getValue() );
printf( "%d\n", d.Left::getValue() );
printf( "%d\n", d.Right::getValue() );
d.setValue(17);
printf( "%d\n", d.getValue() );
printf( "%d\n", d.Left::getValue() );
printf( "%d\n", d.Right::getValue() );
}
Ich würde in Derived Getter und Setter so neu implementieren, dass Left und Right analog gesetzt werden.
Das blöde ist nur, dass das jetzt für eine Membervariable von Base ist. Für jedes Member dieses Prozedere wäre auch wieder doof ...
Mal schauen ob mir noch etwas einfällt

Ich befürchte du wirst nicht drumrum kommen das für jedes Member zu implementieren. Immerhin bringt die Mehrfachvererbung hier ja Mehrdeutigkeiten mit sich. Du bist der einzige der weiß, was der Code leisten soll und welches (in dem Fall beide gleichmäßig) Member gemeint ist. Blöd ist nur, dass dabei Unmengen an Mehr-Code entstehen
LG Glocke
Xin hat geschrieben:Was muss man tun, damit Derived von Left und Right abgeleitet wird, die zwar beides Bases sind, Derived aber nur eine Base besitzt?
/EDIT: Gibt es ab C++11 nicht die Möglichkeit den
this-Zeiger zu modifizieren? Kp ob man das verwenden kann, um die Base von Right auf die Base von Left zeigen zu lassen ... wobei sich das vielleicht als schwierig herausstellen könnte, da Left und Right ja immernoch autonome Member haben sollten - sonst wäre es ja ein "Klon" vom anderen
Ansonsten sehe ich für die "eine Base für Derived" keine Möglichkeit..

siehe Diamond-Problem
/EDIT2: Ansonsten würde mir nur einfallen Derived Instanzen von Left und Right als Member zu geben und gemeinsame Methoden implementieren. Aber auch hier ist recht viel Redundanz da ..