Przeladowanie operatora wyjscia w klasie bazowej

0

Mam pytanie odnośnie linijek :

 
cout << a1 << " " << a1.srednia() << endl ;
cout << a2 << " " << a2.srednia() << endl;
cout << a13 << " " << a13.srednia() << endl;

a1 jest obiektem klasy analiza natomiast jestem w stanie wyrzucić to na ekran dlatego ze mam przeładowany operator wyjścia w klasie pomiar

ostream& operator << (ostream& out,const pomiar& ob)
{
    return out << ob.opis;
}

Moje pytanie to dlaczego to nie ma byc zdefiniowany wewnatrz klasy analiza operator wyjscia ? (Przeciez a1 jest obiektem klasy analiza a nie pomiar jedynie po niej dziedziczy publicznie ale to wciąż inny typ ) Dlaczego kompilator wie jak się zachować w tym przypadku ?

Fragment kodu;

#include <iostream>

using namespace std;
class pomiar{
protected:
    string opis;
    unsigned roz;
    double* tab;
public:
    pomiar():opis("0"),roz(0),tab(new double){}
    pomiar(const string& a1,const unsigned a2)
    :opis(a1),roz(a2),tab(roz? new double(roz):0)
    {
        for(int i = 0 ; i < roz ;i++){
            tab[i]=0;
        }
    }
    pomiar(const string& a1,const double*pocz,const double*kon)
    :opis(a1),roz(kon-pocz),tab(roz? new double[roz]:0)
    {
        for(int i = 0 ; i < roz ; ++i)
        {
            tab[i]=pocz[i];
        }
    }
    friend ostream& operator << (ostream& out,const pomiar& ob);
};

ostream& operator << (ostream& out,const pomiar& ob)
{
    return out << ob.opis;
}

class analiza:public pomiar{
public:
    analiza(){}
    analiza(const string& a1,const double *p,const double *k)
    :pomiar(a1,p,k){}
    double srednia()const throw (string)
    {
    if(roz==0)throw string ("Nie mozna dzielic przez 0");
    double suma = 0;
        for(int i = 0 ; i < roz ; i++)
        {
            suma +=tab[i];
        }
        return suma/roz;
    }

};

int main()
{
    double dane1[] = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9 };
    double dane2[] = { 6.2, 5.0, 3.8, 5.4, 4.6, 6.0, 4.0, 7.5, 2.5 };
    double dane3[] = { 0, 4, 0, 4, 0, 4 };

    analiza a1("Wysokosc trawy [ cm ] ", dane1, dane1+9);
    analiza a2("Moc czynna generatora [ MW ] ", dane2, dane2+9);
    analiza a13("test", dane3, dane3+6);

    cout << a1 << " " << a1.srednia() << endl ;
    cout << a2 << " " << a2.srednia() << endl;
    cout << a13 << " " << a13.srednia() << endl;
}
 
0

No właśnie tak działa dziedziczenie. Klasa pochodna dziedziczy funkcje / składowe klasy bazowej. W operator << klasy bazowej korzystasz ze składowych owej klasy bazowej. Te składowe są również w klasie pochodnej. Gdzie widzisz tu problem?

2
Zaczynam_dziedziczyc napisał(a):

(Przeciez a1 jest obiektem klasy analiza a nie pomiar jedynie po niej dziedziczy publicznie ale to wciąż inny typ )

analiza dziedziczy (publicznie) po pomiar, więc każdy obiekt typu analiza jest obiektem typu pomiar.

0

Okej, zrozumiałem. Dzieki ;]

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