/******************************************************************************

                              Online C++ Compiler.
               Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************/

#include <iostream>

using namespace std;

class Zwierze
{
    double waga;
    
    public:
    string nazwa;
    
    protected: 
    int wiek;
    
    public:
    Zwierze(string nazwa, double waga, int wiek)
    {
        this->nazwa = nazwa;
        this->waga = waga;
        this->wiek = wiek;
    }
    
    void WyswietlDane()
    {
        cout << nazwa << endl;
        cout << "Waga: " + to_string(waga) + " kg" << endl;
        cout << "Wiek: " + to_string(wiek) + " lat" << endl;
    }
};

class Kot : public Zwierze
{
    bool czyKuwetaCzysta;
    bool czyWychodzacy;
    
    public:
    Kot(bool czyKuwetaCzysta, bool czyWychodzacy, string nazwa, double waga, int wiek) : Zwierze(nazwa, waga, wiek)
    {
        this->czyKuwetaCzysta = czyKuwetaCzysta;
        this->czyWychodzacy = czyWychodzacy;
    }
    
    void WyswietlDane()
    {
        Zwierze::WyswietlDane();
        
        if(czyWychodzacy)
        {
            cout << "Kot wychodzący" << endl;
        }
        else 
        {
            cout << "Kot niewychodzący" << endl;
        }
        
        if(!czyKuwetaCzysta)
        {
            cout << "Kuweta wymaga sprzątania" << endl;
        }
    }
    
    void PokazWiek()
    {
        cout << wiek << endl;
    }
};

class Pers : public Kot
{
    int ileCzasaniaTyg;
    bool wymagaOdklaczania;
    
    public:
    Pers(string nazwa, double waga, int wiek, bool czyKuwetaCzysta, bool czyWychodzacy, int ileCzasaniaTyg, bool wymagaOdklaczania) : Kot(czyKuwetaCzysta, czyWychodzacy, nazwa, waga, wiek)
    {
        this->ileCzasaniaTyg = ileCzasaniaTyg;
        this->wymagaOdklaczania = wymagaOdklaczania;
    }
    
    void WyswietlWszystkieDane()
    {
        Kot::WyswietlDane();
        cout << "Czesany " << to_string(ileCzasaniaTyg) << " razy w tygodniu" << endl;
        
        if(wymagaOdklaczania) cout << "Kot wymaga podania preparatu na odkłaczanie" << endl;
    }
    
    void PokazWiek()
    {
        cout << wiek << endl;
    }
};

class Pies : protected Zwierze
{
    int ileSpacerowDziennie;
    bool maWybieg;
    
    public:
    Pies(string nazwa, double waga, int wiek, int ileSpacerowDziennie, bool maWybieg) : Zwierze(nazwa, waga, wiek)
    {
        this->ileSpacerowDziennie = ileSpacerowDziennie;
        this->maWybieg = maWybieg;
        
    }
    
    void WyswietlDane()
    {
        cout << "Imie: " << nazwa << endl;
        cout << "Wiek: " << wiek << endl;
        cout << "Spacery: " << to_string(ileSpacerowDziennie) << " dziennie" << endl;
        if(maWybieg) cout << "Ma wybieg" << endl;
    }
};

class Kon
{
    
};

int main()
{
    Zwierze zwierz1("Random zwierz", 10.5, 2);
    
    zwierz1.WyswietlDane();
    
    
    Kot kot1(false, false, "Felek", 5.9, 5);
    kot1.WyswietlDane();
    
    cout << "\n\n***************\n" << kot1.nazwa << "\n\n***************" <<  endl;
    kot1.PokazWiek();
    
    Pers pers1("Pimpek", 3.4, 8, true, true, 2, false);
    pers1.WyswietlWszystkieDane();
    pers1.PokazWiek();
    
    Pies pies1("Burek", 21, 4, 3, false);
    pies1.WyswietlDane();
    // dostep do nazwy zabrany przez dziedziczenie protected
    //cout << "\n\n***************\n" << pies1.nazwa << "\n\n***************" <<  endl;

    //cout << pies1.wiek << endl;
    return 0;
}