Definition operator= für abgeleitete Klasse



  • Hi,
    angenommen Klasse B erbt von Klasse A. Wenn ich nun einer Variable des Typs B eine andere zuweise, soll u.A. das gleiche passieren, wie es auch bei der Elternklasse der Fall ist, also wenn ich einer Variable von Typ A eine andere vom Typ A zuweise.
    Kann man das so schreiben:

    B& operator= (const B& b) {
                A::operator=(b);    
                return *this;
    }
    

  • Mod

    Ja, das wäre eine Möglichkeit. Wenn du aber wirklich gar nichts anderes machst, als den Zuweisungsoperator der Basisklasse aufzurufen, dann kannst du dir das auch sparen, weil der automatisch erzeugte Zuweisungsoperator nichts anderes macht, als die Zuweisungsoperatoren aller Basen und Attribute aufzurufen.



  • $edit: Mist



  • danke für die Antwort.
    Danach soll noch etwas anderes passieren.



  • Ich vergas, ist das der normal übliche Weg oder schreibt man da gewöhnlich etwas anderes?


  • Mod

    EineFrage schrieb:

    Ich vergas, ist das der normal übliche Weg oder schreibt man da gewöhnlich etwas anderes?

    Wenn man eine Basisklassenoperator aufrufen wollte, würde man es so machen. Aber normalerweise würde man für den Zuweisungsoperator das Copy&Swap Idiom benutzen



  • Beim lesen was "Copy&Swap Idiom" ist bin ich in einem Link auf "Rule of Three/ The BiG Three" gestoßen.
    (https://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)
    Ich also wenn ich einen einen copy operator habe auch einen copy Konstruktur haben soll. Den habe ich teils noch nicht.

    Wenn dieser in meinen Fall, u.A. das gleiche wie in der Basisklasse machen soll, schreibe ich bzw. schreibt man:

    B(const B& b):A(b) {
        //code der nur für B gedacht ist
    }
    

    richtig ?


  • Mod

    Ja. Wobei natürlich auch hier wieder die Rule of 0 gilt, dass man fast immer gar keinen der 3/5 braucht (5 ist die neue Rule of 3). Dass man selber eine ressourcenhaltende Klasse schreibt, deren Funktionalität nicht durch die Standardbibliothek abgedeckt wird, ist doch eher selten.



  • (5?-> mit move operator/konstruktor)

    SeppJ schrieb:

    Dass man selber eine ressourcenhaltende Klasse schreibt, deren Funktionalität nicht durch die Standardbibliothek abgedeckt wird, ist doch eher selten.

    Is dem so? oder ist mit "ressourcenhaltend" ein Klasse mit move gemeint?
    Weil copy nimmt man doch recht oft. Z.B. sobald eine Klasse ein Array beinhalted.

    Oder irre ich mich? Macht man das in c++ nicht mehr?


  • Mod

    EineFrage schrieb:

    Is dem so? oder ist mit "ressourcenhaltend" ein Klasse mit move gemeint?

    Nein, mit ressourcenhaltend ist gemeint, dass die Klasse eine begrenzte Ressource verwaltet. Wo man z.B. bei Kopien drauf aufpassen muss, dass man auch eine neue Instanz der Ressource anfordert, sie beim Löschen wieder freigibt, usw.
    Das offensichtlichste Beispiel ist dynamischer Speicher. Andere Beispiele sind z.B. Datenbankverbindungen, offene Dateien, Pipes, usw.

    Aber es dürfte recht selten vorkommen, dass man wirklich etwas verwalten möchte, was nicht entweder durch die fertigen Klassen der Standardbibliothek abgedeckt wird (dynamischer Speicher, Dateien, ...) oder aber sich nicht mit wenigen Schritten aus den allgemeinen Ressourcenhalterklassen der Standardbibliothek (Smartpointer) ableiten lässt.

    Weil copy nimmt man doch recht oft. Z.B. sobald eine Klasse ein Array beinhalted.

    Oder irre ich mich? Macht man das in c++ nicht mehr?

    Was sollen Arrays damit zu tun haben? Da muss man nichts kopieren, weder in C noch in C++.

    Zeig vielleicht wirklich mal konkret, was deine Klasse machen soll.


Anmelden zum Antworten