//----------------------------------------------------------
// programa demo de C++
// versao #3:  (a) heranca e (2) construtores com argumentos em C++
// preparado para MAC441, 2do sem. 1998, MAC-IME-USP
// Hernan Astudillo

//----------------------------------------------------------
#include <iostream.h>

//----------------------------------------------------------
class Pessoa {
   private:
      char* _nome;
      int _rg;
   public:
      // construtor
      Pessoa(const char* nome, const int& rg)
        {
	    cout << "** criando Pessoa com dados:" << endl;
	    cout << "nome=" << nome << endl;
	    cout << "rg=" << rg << endl;
	    // atualiza os campos da instancia
	    _nome = new char[20];
	    strcpy(_nome, nome);
	    _rg = rg;
	};//construtor de Pessoa
      // metodo (member) para mostrar os valores da pessoa
      bool mostrar_todo(){
	  cout << "** dados da pessoa:" << endl;
	  cout << "nome=" << _nome << endl;
	  cout << "rg=" << _rg << endl;
      }; //mostrar_todo
}; //Pessoa

//----------------------------------------------------------
class Trabalhador : Pessoa {
   private:
      // `_nome' e `_rg' sao heranca de Trablhador
      float _salario;
   public:
      // construtor
      Trabalhador( const char* nome, const int& rg, const float& salario)
	  : Pessoa (nome, rg)
	{
	    cout << "** criando Trabalhador com dados adicionais:" << endl;
	    cout << "salario=" << salario << endl;
	    // atualiza os campos da instancia
	    _salario = salario;
	};//construtor de Trabalhador
      // metodo (member) para mostrar os valores da trabalhador
      bool mostrar_todo(){
	  Pessoa::mostrar_todo();
	  cout << "** dados adicionais de trabalhador:" << endl;
	  cout << "salario=" << _salario << endl;
      }; //mostrar_todo
}; //Trabalhador

//----------------------------------------------------------
class Estudiante : Pessoa {
   private:
      // `_nome' e `_rg' sao heranca de Trablhador
      float _numUSP;
   public:
      // construtor
      Estudiante( const char* nome, const int& rg, const int& numUSP)
	  : Pessoa (nome, rg)
	{
	    cout << "** criando Estudiante com dados adicionais:" << endl;
	    cout << "numUSP=" << numUSP << endl;
	    // atualiza os campos da instancia
	    _numUSP = numUSP;
	};//construtor de Estudiante
      // metodo (member) para mostrar os valores da trabalhador
      bool mostrar_todo(){
	  Pessoa::mostrar_todo();
	  cout << "** dados adicionais de estudiante:" << endl;
	  cout << "numUSP=" << _numUSP << endl;
      }; //mostrar_todo
}; //Estudiante

//----------------------------------------------------------
class Monitor : Estudiante, Trabalhador {
   private:
      // `_nome', `_rg' e `_salario' sao heranca de Trabalhador
      // `_nome', `_rg' e `_numUSP' sao heranca de Estudiante
   public:
      // construtor
      Monitor( const char* nome, const int& rg, const int& numUSP, const float& salario)
	  : Estudiante (nome, rg, numUSP), Trabalhador (nome, rg, salario)
	{
	    cout << "** criando Monitor sem dados adicionais" << endl;
	};//construtor de Monitor
      // metodo (member) para mostrar os valores da trabalhador
      bool mostrar_todo(){
	  Estudiante::mostrar_todo();
	  Trabalhador::mostrar_todo();
      }; //apresentar
}; //Monitor

//----------------------------------------------------------
main (){
    Pessoa* p = new Pessoa ("p", 0);
    Trabalhador* t = new Trabalhador ("t", 1, 200.0);
    Estudiante* e = new Estudiante ("e", 2, 555);
    Monitor* m = new Monitor ("m", 3, 666, 100.0);
    p->mostrar_todo();
    t->mostrar_todo();
    e->mostrar_todo();
    m->mostrar_todo();
};
//----------------------------------------------------------
