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

class Covjek {
protected:
      string m_ime;
public:
       Covjek () : m_ime() {}
       Covjek (char *ime) : m_ime(ime) {}
       ~Covjek() {}
       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)
       {      m_ime = ime; m_placa = placa; }
       ~Radnik() {}
       void print() const { // novi print() koji sakrije definiciju starog printa
            Covjek::print();
            cout << " " << m_placa;
       }
};

int prebrojiRadnike(list<Covjek*> &pl) {
    int br = 0; Radnik r("x",0); Covjek c;
    for (list<Covjek*>::iterator it = pl.begin(); it != pl.end(); ++it) {
        if ( typeid(*(*it)) == typeid(r) ) ++br;
    }
    return br;
}

int main() {
//    Covjek c("Pero"); Radnik r("Ivo", 4500);
    Covjek c1("Sure");
    Covjek c2("Luja");
    Radnik r("Cajper", 5000);
    int i;
    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 << endl << ( typeid(c1).name() ) << endl;
    cout << endl << ( typeid(r).name()  ) << endl;
    cout << endl << ( typeid(i).name()  ) << endl;
    
    cout << "Radnika ima " << prebrojiRadnike(pl) << endl;
    return 0;
}














