operator= bei Mehrfachvererbung



  • Hallo,

    ich habe folgende Klassen:

    class A
    {
    protected:
      std::string a;
      std::string b;
    ...
       virtual A &operator=(const A &a);
    ...
    };
    
    class B : public virtual A
    {
    protected:
    int c;
    ...
      virtual B &operator=(const A &a);
      virtual B &operator=(const B &b);
    ...
    };
    
    class C : public virtual A
    {
    protected:
    int d;
    ...
      virtual C &operator=(const A &a);
      virtual C &operator=(const C &c);
    ...
    };
    
    class D : public B, public C
    {
    int e;
    ...
      virtual D &operator=(const A &a);
      virtual D &operator=(const B &b);
      virtual D &operator=(const C &c);
      virtual D &operator=(const D &d);
    ...
    };
    

    Nun besteht logischerweise ein Konflikt bei operator=(const A &a) in Klasse D, da sowohl Klasse B als auch Klasse C diesen Operator verwenden.

    Gibt es hierzu eine Lösung oder ist dies allgemein nicht möglich?



  • Eine gängige Lösung ist alle Basisklassen abstrakt zu machen und die Möglichkeiten zur Kopie protected. Zuweisungen sind dann nur in den abgeleiteten Klassen möglich, du sparst dir virtuelle Assignmentoperatoren und verhinderst mixed-type-assignments.



  • Keine der Klassen soll in diesem Beispiel abstrakt sein.

    ...also lässt sich der =-Operator hier nicht umsetzen und stattdessen eine clone-Funktion nutzen?



  • Starcluster schrieb:

    Keine der Klassen soll in diesem Beispiel abstrakt sein.

    ...also lässt sich der =-Operator hier nicht umsetzen und stattdessen eine clone-Funktion nutzen?

    Dann ändere dein Design. Nicht nur ist MI häufig falsch, auch sollten alle Basisklassen abstrakt sein



  • Ist halt die Vorgabe einer Aufgabe. 😉



  • Starcluster schrieb:

    Nun besteht logischerweise ein Konflikt bei operator=(const A &a) in Klasse D, da sowohl Klasse B als auch Klasse C diesen Operator verwenden.

    Gibt es hierzu eine Lösung oder ist dies allgemein nicht möglich?

    Was für ein Konflikt?
    Was funktioniert denn nicht so wie geplant?



  • Habe es nun unter Code::Blocks kompiliert. Dort funktioniert es komischerweise...
    Evtl. ein Bug in VS12?



  • Sorry, ich meinte VS2013...



  • Poste mal ein vollständiges, minimales Beispiel, was wir einfach Copy & Pasten können und unter VS2013 einen Fehler erzeugt.


Log in to reply