Zobacz jak można ten kod napisać
- Bez używania zdublowanych zmiennych w klasach pochodnych.
- Używając czysto wirtualnej funkcji daj_glos w klasie bazowej.
- Z użyciem listy inicjalizacyjnej w której wywoływany jest konstruktor klasy bazowej
- Używając inteligentnych wskaźników uinque_ptr
- Dodając przeładowanie operatora << w celu czytelnego wyświetlania danych z klasy
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
class Zwierze
{
public:
Zwierze( const string& nazwa_ , const string& kolor_ , int rozmiar_ , int wiek_ ) : nazwa {nazwa_} , kolor {kolor_} , rozmiar {rozmiar_} , wiek {wiek_} {}
virtual ~Zwierze(){}
virtual void daj_glos() = 0;
const string nazwa;
string kolor;
int rozmiar {0};
int wiek {0};
friend ostream& operator<<( ostream& os , const Zwierze& zwierze )
{
os << "Jestem " << zwierze.nazwa << " mam kolor " << zwierze.kolor << " , rozmiar = " << zwierze.rozmiar << " wiek = " << zwierze.wiek << endl;
return os;
}
};
class Kot : public Zwierze
{
public:
Kot( const string& kolor_ , int rozmiar_ , int wiek_ ) : Zwierze("Kot",kolor_,rozmiar_,wiek_) {}
void daj_glos() override { cout << "Miau " << endl; }
};
class Pies : public Zwierze
{
public:
Pies( const string& kolor_ , int rozmiar_ , int wiek_ ) : Zwierze("Pies",kolor_,rozmiar_,wiek_) {}
void daj_glos() override { cout << "Woof " << endl; }
};
class Krowa : public Zwierze
{
public:
Krowa( const string& kolor_ , int rozmiar_ , int wiek_ ) : Zwierze("Krowa",kolor_,rozmiar_,wiek_) {}
void daj_glos() override { cout << "Muuuu " << endl; }
};
int main()
{
vector<unique_ptr<Zwierze>> farma;
farma.emplace_back(make_unique<Pies>("Szary",20,3));
farma.emplace_back(make_unique<Krowa>("Brazowa",120,7));
farma.emplace_back(make_unique<Kot>("Bialy",18,2));
for( const auto& zwierze : farma )
{
cout << *zwierze;
zwierze->daj_glos();
}
return 0;
}