Operator przypisania w dziedziczeniu, a obiekt składowy klasy

0
#include <iostream>
using namespace std;
enum kolor {czarny,czerwony,niebieski,bialy};

class pojazd
{
protected:
    int ilosc_kol;
public:
    pojazd(int ile) : ilosc_kol(ile) {}
    pojazd(const pojazd &);
    pojazd & operator=(const pojazd & wz);
};

class automobil : public pojazd
{
    int stan_licznika;
    kolor kolor_karoserii;
public:
    automobil(int kola, kolor k, int licznik) : pojazd(kola)
    {
        stan_licznika = licznik;
        kolor_karoserii = k;
    }
    automobil(const automobil &);
    automobil & operator=(const automobil &ww);
    friend ostream & operator <<(ostream & ekran, const automobil & obj);
};

pojazd::pojazd(const pojazd & wzor)
{
    ilosc_kol = wzor.ilosc_kol;
}

automobil::automobil(const automobil & wzorzec) : pojazd(wzorzec)
{
    stan_licznika = 0;
    kolor_karoserii = wzorzec.kolor_karoserii;
}

pojazd & pojazd::operator=(const pojazd & wz)
{
    ilosc_kol = wz.ilosc_kol;
    return *this;
}

automobil & automobil::operator=(const automobil & wzor)
{
    // 1 sposob:
    (*this).pojazd::operator=(wzor);

    // 2 sposob:
    pojazd *wskpojazd = this;
    (*wskpojazd) = wzor;

    // 3 sposob:
    pojazd & refpojazd = *this;
    refpojazd = wzor;

    // dalsza czesc operatora przypisania
    kolor_karoserii = wzor.kolor_karoserii;
    stan_licznika = wzor.stan_licznika + 2;
    return *this;
}

ostream & operator<<(ostream & ekran, const automobil & obj)
{
    ekran << " Liczba kol " << obj.ilosc_kol
          << ", Licznika " << obj.stan_licznika
          << ", kolor nr"  << obj.kolor_karoserii << endl;
          return ekran;
}
 

Jakby wyglądała ta częśc kodu:

automobil & automobil::operator=(const automobil & wzor)
{
    // 1 sposob:
    (*this).pojazd::operator=(wzor);

    // 2 sposob:
    pojazd *wskpojazd = this;
    (*wskpojazd) = wzor;

    // 3 sposob:
    pojazd & refpojazd = *this;
    refpojazd = wzor;

    // dalsza czesc operatora przypisania
    kolor_karoserii = wzor.kolor_karoserii;
    stan_licznika = wzor.stan_licznika + 2;
    return *this;
} 

jeśli w klasie automobil byłby np.obiekt klasy drzwi ?

0

Tak obiekt klasy drzwi byłby kolejną składową, tak jak kolor_karoserii czy stan_licznika, zatem jeśli przy operacji przypisania ma nie edytować tego obiektu to wystarczy dodać linijkę:

drzwi = wzor.drzwi;
0

i w ten sposób wywoła się operator przypisania klasy drzwi ?

0

Dokladnie, jeśli nie przeciążysz operatora przypisania w klasie drzwi, automatycznie "przepisze" on wszystkie składowe, dlatego operator przypisania przeciąża się w specyficznych sytuacjach(np. w Twoim przykładzie zwiększasz stan licznika o 2).

1 użytkowników online, w tym zalogowanych: 0, gości: 1