#include <iostream.h>
#include <string>
#include "list.h"
#include "ListIterator.h"

class Persona {
public: 
  Persona(string s):nome(s) {  }
   virtual void print() { cout << "Il mio nome e' " << nome << endl; }
protected:
  string nome;
};

class Studente : public Persona {
public: 
  Studente(string s, float g) : Persona(s),media(g) { }
  void print() { cout << "Il mio nome e' " << nome
     << " e la mia media e' " << media << endl; }
private:
  float media;
};

class Professore : public Persona {
public: 
  Professore(string s, int n) : Persona(s), pubblicazioni(n) { }
  void print() { cout << "Il mio nome e' " << nome
     << " ed ho  " << pubblicazioni << " pubblicazioni" << endl; }
private:
  int pubblicazioni;
};
void interroga(Persona *p){p->print();}
int main()
{
  list <Persona> p;
  Persona *x = new Persona(string("Giuseppe"));
  p.enter(x); 
  x = new Studente(string("Giovanni"), 21.);
  p.enter(x); 
  x = new Professore(string("Antonio"), 7);
  p.enter(x); 
  ListIterator<Persona> it(p);
  while(it.next())  interroga(it.current()) ;
        return 0;
}
