Prioritätsfrage
-
Hi!
Bei Klassen wird ja automatisch ein Zuweisungsoperator erstellt - aber wie
verhält sich das bei abgeleiteten Klassen?Beispiel:
class A { A& operator=( const A& b); // privat - Werte } class B : public A { // Kein Zuweisungsop deklariert // privat - Werte }
Welcher Zuweisungsoperator wird bei B jetzt genommen? Der automatisch gen-
erierte von B oder der eigene aus A?Würde mich freuen, wenn jemand die Antwort darauf hätte
MfG,
EnERgYzEr
-
Da der vom Compiler generierte operator= auch den operator= der Basisklasse aufruft, dieser jedoch private ist, wird gar kein operator= für B generiert.
B b1; B b2; b1 = b2;
sollte einen Compilerfehler auslösen, da B::operator= nicht existiert.
-
Also der Operator von A soll nicht privat sein, sondern schon public
deklariert sein - oder meintest du was anderes?
-
In deinem Beispiel ist er private
Wenn er public ist, dann wird er auch in vererbten Klassen aufgerufen.
-
hast recht - sorry
Also unter dieser Voraussetzung:
class A { public: A& operator=( const A& b); } class B : public A { // Kein Zuweisungsop deklariert }
würde für B der Operator aus A aufgerufen werden, statt des selbsterstellten
vom Compiler?Und vielen Dank für Deine Antwort
-
Also was ich sagen wollte: Er wird nicht alleine aufgerufen. Wenn man ein b einem anderen b zuweist, wird der vom Compiler erstellte B::operator= aufgerufen, der seinerseits deinen A::operator= aufruft.
-
tag schrieb:
Also was ich sagen wollte: Er wird nicht alleine aufgerufen. Wenn man ein b einem anderen b zuweist, wird der vom Compiler erstellte B::operator= aufgerufen, der seinerseits deinen A::operator= aufruft.
d.h. es würden auch die neuen Members aus B kopiert werden? Aber für die alten
Members würde der A-Operator verwendet?Wenn ich also im A-Operator gewisse Einschränkungen mache (wie bei Pointern z.B.)
würde das auch in der B-Klasse wirken?
-
EnERgYzEr schrieb:
d.h. es würden auch die neuen Members aus B kopiert werden? Aber für die alten
Members würde der A-Operator verwendet?Wenn ich also im A-Operator gewisse Einschränkungen mache (wie bei Pointern z.B.)
würde das auch in der B-Klasse wirken?Genau, der implizit definierte Copy op= ruft den Operator der Basis-Klasse auf. In der abgeleiteten Klasse kopiert er die Elemente per Zuweisung.
-
Shlo schrieb:
Nö, der Copy-Zuweisungsoperator der Basis-Klasse muss für den implizit definierten Copy op= der abgeleiteten Klasse zugänglich sein, ansonsten lässt sich das Programm erst gar nicht kompilieren.
Hab ich doch gesagt: Wenn A::operator= private ist, kann B::operator= ihn nicht aufrufen. Da der compilergenerierte B::operator= aber A::operator= aufrufen müsste, kann B::operator= nicht generiert werden.
@EnERgYzEr
http://www.kuzbass.ru:8086/docs/isocpp/special.html#class.copy 10-13The implicitly-defined copy assignment operator for class X performs memberwise assignment of its subobjects. The direct base classes of X are assigned first, in the order of their declaration in the base-specifier-list, and then the immediate nonstatic data members of X are assigned, in the order in which they were declared in the class definition. Each subobject is assigned in the manner appropriate to its type:
* if the subobject is of class type, the copy assignment operator for the class is used (as if by explicit qualification; that is, ignoring any possible virtual overriding functions in more derived classes);
* if the subobject is an array, each element is assigned, in the manner appropriate to the element type;
* if the subobject is of scalar type, the built-in assignment operator is used.An implicitly-declared copy assignment operator is implicitly defined when an object of its class type is assigned a value of its class type or a value of a class type derived from its class type. A program is ill-formed if the class for which a copy assignment operator is implicitly defined has:
* a nonstatic data member of const type, or
* a nonstatic data member of reference type, or
* a nonstatic data member of class type (or array thereof) with an inaccessible copy assignment operator, or
* a base class with an inaccessible copy assignment operator.
-
Ich weiß, es ist schon spät
-
Stimmt. Ich wollte eigentlich auch schon längst im Bett sein
P.S.
Vielleicht auch ganz interessant: http://www.gotw.ca/gotw/069.htm