Wenn man den Zuweisungsoperator selbst definiert, muß man an alle Datenelemente der Klasse zuweisen.
Das ist klar, aber bei abgeleiteten Klassen gar nicht so einfach:
class base { int x; public: base(int i) : x(i) {} }; class deriv: public base { int y; public deriv(int i): base(i), y(i) {} deriv& operator=(const deriv& rhs); };
Falsch ist folgender Zuweisungsoperator für deriv:
deriv& deriv::operator=(const deriv& rhs) { if (this == &rhs) return *this; y=rhs.y; return *this; }
da er die x-Komponente der Basisklasse nicht setzt.
So ist es richtig:
deriv& deriv::operator=(const deriv& rhs) { if (this == &rhs) return *this; ((base&) *this) = rhs; y=rhs.y; return *this; }
Wichtig ist die Typumwandlung auf base&
. Ohne &
würde
durch den Copy-Konstruktor ein temporäres Objekt vom Typ
base kreiert.
Wenn base einen eigenen = Operator hat, ist es einfacher:
deriv& deriv::operator=(const deriv& rhs) { if (this == &rhs) return *this; base::operator=(rhs); y=rhs.y; return *this; }