ich folgende Diamant Klassenstruktur haben, die nicht kompiliert:C++ Lösung von Diamant Vererbung ohne virtuelle Vererbung
class Base{
int a;
public:
virtual void doSomething();
};
class NotMineToTouch : public Base {};
class MyParentClass : public Base {};
class EvilDiamond : public NotMineToTouch, public MyParentClass {};
// I need these methods (that I cannot necessarily edit) to work for an EvilDiamond
void processBase (Base* b) { b->doSomething; /*...*/} // Cannot edit
void processParent (MyParentClass* p) { p->doSomething; /*...*/} // Can edit
void processNotMine (NotMineToTouch* n) { n->doSomething; /*...*/} // Cannot edit
ich die normale Lösung wissen praktisch von Base
zu erben ist; Ich darf jedoch nicht NotMineToTouch
(oder Base
) ändern. Gibt es eine andere Lösung? Ich bin berechtigt, MyParentClass
und EvilDiamond
zu meinem Vergnügen zu ändern; EvilDiamond
muss jedoch von MyParentClass
und NotMineToTouch
erben, und MyParentClass
muss von Base
erben und darf nicht von EvilDiamond
erben.
Ich erhalte kein Fehler eine Warnung nur. Können Sie uns den tatsächlichen Compilerfehler geben, den Sie erhalten, oder den Code eingeben, der das Problem reproduziert? Übrigens ist es kein Diamant, wenn Sie keine virtuelle Vererbung verwenden. Die virtuelle Vererbung verbindet die beiden Basen zu einer einzigen, die die Rautenform erzeugt, wenn Sie sie in einem Diagramm zeichnen. – Eelke
Wir nennen die virtuelle Methode getA() an anderen Stellen auf Bases und MyParentClass (im Code kann ich nicht immer ändern). Es ist vielleicht keine Diamantenvererbung, aber es ist sicherlich das Diamantproblem (siehe die Beschreibung auf dem Etikett). Compiler Fehler beim Aufruf von getA() auf einem EvilDiamond: Fehler: Anfrage für Mitglied 'getA' ist mehrdeutig Hinweis: Kandidaten sind: virtual int Base :: getA() Hinweis: virtual int Base :: getA() –
Kann Sie nicht zum richtigen Typ, wenn Sie das Objekt übergeben? –