#include <iostream>
#include <list>
using namespace std;

class Covjek {
protected:
      string m_ime;
public:
       Covjek () : m_ime() {cout<<"Stvaram Covjek-a"<<endl;}
       Covjek (char *ime) : m_ime(ime) {cout<<"Stvaram Covjek-a"<<endl;}
       ~Covjek() {cout<<"Unistavam Covjek-a"<<endl;}
       virtual void print() const {cout << m_ime;}
       string get_ime() const { return m_ime; }
};

class Radnik : public Covjek {
      int m_placa;
public:
//       Radnik (char *ime, int placa) : Covjek(ime), m_placa(placa) { }
       Radnik (char *ime, int placa) // : Covjek(ime)
       {      cout<<"Stvaram Radnik-a"<<endl;
              m_ime = ime; m_placa = placa; }
       ~Radnik() {cout<<"Unistavam Radnik-a"<<endl;}
       void print() const { // novi print() koji sakrije definiciju starog printa
            Covjek::print();
            cout << " " << m_placa;
       }
};

int main() {
//    Covjek c("Pero"); Radnik r("Ivo", 4500);
    Covjek c1("Sure");
    Covjek c2("Luja");
    Radnik r("Cajper", 5000);
    list<Covjek*> pl;
//    list<Covjek&> pl;
//    list<Covjek> pl;
    pl.push_back(&c1);
    pl.push_back(&c2);
    pl.push_back(&r); // radnik!
    for (list<Covjek*>::iterator it = pl.begin(); it != pl.end(); ++it)
        { (*it)->print(); cout << endl; }
    r.print();
    
    cout << ( typeid(c1).name() ) << endl;
    
    return 0;
}














