#include <iostream>
using std::cout;
using std::endl;
using std::ostream;

#include <string>
using std::string;

class Henkilo {
protected:
        string nimi;
public:
        Henkilo(const string &n) : nimi(n) {}
        string kerro_nimi() const { return " h "+nimi; }
        virtual string vkerro_nimi() const { return " h "+nimi; }
        friend ostream& operator<< (ostream &out, const Henkilo &h);

        unsigned tunnus;
};

ostream& operator<< (ostream &out, const Henkilo &h) {
        out << h.nimi << " tunnus " << h.tunnus;
        return out;
}

class Palkollinen : public Henkilo {
public:
        Palkollinen(const string &n) : Henkilo(n) {}
        string kerro_nimi() const { return " p "+nimi; }
        virtual string vkerro_nimi() const { return " p "+nimi; }

        unsigned tunnus;
};

int main(void) {
        Palkollinen *p = new Palkollinen("Veijo");
        Henkilo *h=p;

        p->tunnus=1234;
        h->tunnus=9876;

        cout << p->kerro_nimi() << " tunnus " << p->tunnus << endl;
        cout << h->kerro_nimi() << " tunnus " << h->tunnus << endl;

        cout << p->vkerro_nimi() << endl;
        cout << h->vkerro_nimi() << endl;

        return 0;
}