Gegeben ein Zeiger auf eine abstrakte Basisklasse A*
, ich möchte es (als die Basisklasse) kopieren oder zuweisen und den abgeleiteten Kopierkonstruktor oder Zuweisungsoperator aufgerufen haben. Ich verstehe, dass Kopierkonstruktoren nicht virtuell sein können, daher ist der Kopierkonstruktor vermutlich keine Option dafür, sondern der Zuweisungsoperator. Trotzdem scheint es nicht zu funktionieren: der folgende Code drucktWie man abgeleiteten Zuweisungsoperator von der Basisklasse aufruft?
assigned a
x!
destroyed b
destroyed b
, die nicht zuweisen b.
#include <iostream>
using namespace std;
class A
{
public:
virtual void x()=0;
virtual ~A() {}
virtual A& operator=(const A& other) { cout << "assigned a" << endl; return *this;}
};
class B : public A
{
public:
virtual B& operator=(const B& other) { cout << "assigned b" << endl; return *this;}
virtual void x() { cout << "x!" << endl; }
virtual ~B() { cout << "destroyed b" << endl; }
};
int main()
{
A* a = new B();
A* aa = new B();
*aa=*a;
aa->x();
delete a;
delete aa;
return 0;
}
Wie geht das?
EDIT Diese Frage wurde unten korrekt beantwortet, aber es war die falsche Frage. Ich sollte nicht versuchen, den Zuweisungsoperator zu überschreiben, weil ich nicht möchte, dass Unterklassen von A einander zuweisen. siehe die einfachere Antwort (hoffentlich) C++ elegantly clone derived class by calling base class
Nicht dass es viel ausmacht, aber die Frage fragt nach einer ** virtuellen Basisklasse ** und der Code hat keine. –
Ich denke du meinst * abstract * Basisklasse, nicht "virtual" (was eine ganz andere Sache ist). Die Abstraktheit der Basisklasse ist für Ihr Problem nicht relevant. – molbdnilo
tue ich. Siehe Bearbeiten. –