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-13

    The 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


Anmelden zum Antworten