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;
}