016
07.09.2006, 17:34 Uhr
virtual
Sexiest Bit alive (Operator)
|
Was den op= angeht:
In der Regel wird in einem op= niemals der op= der Basisklasse aufgerufen. Wenn Dudiesen langen text, welcher es auch nicht explizt darstellt, nicht lesen willst, dann nur kurz folgendes:
Ich nehme an
C++: |
class base { // Irgend eine Klasse mit überladenen op= };
class derived { int addition;
public: derived& operator = ( const derived& drvd) { addition = drvd.addition; base::operator = (drvd); // Aufruf von op= der basisklasse return *this; } };
|
Solcher Code ist potentiell gefährlich, weil der op= der Basisklasse eine Exception werfen kann, was ein kaputtes Object hinterlassen würde. Normalerweise wird ein op= bei angeleiteten Klassen mit Hilfe einer temp. Kopie von drvd und anschlieesendem swap realisiert:
C++: |
derived& operator = ( const derived& drvd) { derived tmp(drvd); swap(tmp); return *this; } void swap(derived& drvd) { std::swap(drvd.addition, addition); base::swap(drvd); // Sollte vorhanden sein! }
|
Will sagen: es ist nicht trivial, den op= korrekt zu schreiben, im Falle daß base keine swap Methode bereitstellt mitunter richtig ekelhaft. Schon allein dieser Grund kann ausreichend sein, vererbung zu verbieten. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |