// IG17 2004-05, II17 2005-06 // Empleados.h // 26-11-2004 // Ejemplo del Tema 3: relación de herencia entre clases que // gestionan información sobre varios tipos de empleados. // Ejercicios: // // * Implementa, y prueba con todos los tipos de empleados, las funciones: // Empleado::ObtenerNombre() // Comercial::CambiarComision() // // Observa que con objetos de las clases Comercial y Mecanico puedes // emplear las funciones publicas de la clase base Empleado, pero // con objetos de las clases Empleado y Mecanico no puedes emplear // la funcion publica CambiarComision() de la clase Comercial. // // * Intenta implementar una funcion Comercial::ObtenerSueldoBase() y // observa que, por ser un miembro privado de Empleado, el // compilador no te permite acceder al atributo sueldoBase. // Comprueba que si lo declaras "protected" en Empleado ese // acceso es posible. Vuelve a hacerlo privado e implementa // Empleado::ObtenerSueldoBase(). // // * Completa la clase ComercialTienda, anyadiendo como atributos el // numero de horas extra realizadas y el sueldo por hora extra. // // Implementa otra clase ComercialCalle, derivada de Comercial, // con el numero de kilometros realizados y el sueldo por kilometro. // // Redefine en ambas la funcion CalcularSueldo() para calcular el // sueldo como la suma del correspondiente a todos los comerciales // mas el correspondiente a las horas extra o a los kilometros, // segun de que tipo de comercial se trate. Supon que en el caso de // las horas extra se aplican retenciones y en el caso de los // kilometros no se aplican. #ifndef _EMPLEADOS_H #define _EMPLEADOS_H #include class Empleado { string nombre; float sueldoBase; protected: float retenciones; public: Empleado (string = "", float = 0, float = 0); //nombre, sueldoBase, retenciones void Ver() const; float CalcularSueldo() const; void CambiarRetenciones(float); }; class Comercial : public Empleado { float ventas, comision; public: Comercial(string = "", float = 0, float = 0, float = 5); //nombre, sueldoBase, retenciones, comision void SumarVentas(float); void Ver() const; float CalcularSueldo() const; }; class Mecanico : public Empleado { float sueldoReparacion; int reparaciones; public: Mecanico(string = "", float = 0, float = 0, float = 5); //nombre, sueldoBase, retenciones, sueldoReparacion void SumarReparaciones(int); void Ver() const; float CalcularSueldo() const; }; class ComercialTienda : public Comercial { // Observa que, sin hacer mas, la clase ComercialTienda tiene ya los // atributos y metodos heredados de Comercial (que incluyen los que // Comercial hereda de Empleado). Tambien tiene (hasta que // implementemos otro constructor) un constructor por defecto sin // argumentos, que llama al constructor sin argumentos de // Comercial. Ello nos permite ejecutar ya, por ejemplo, lo // siguiente en EjemploEmpleados.cpp: // // ComercialTienda ct; // ct.CambiarRetenciones(33); // ct.Ver(); // // Hemos heredado Empleado::Ver() y Comercial::Ver(). Mientras no // exista ComercialTienda::Ver(), la instruccion ct.Ver() equivaldra // a ct.Comercial::Ver(), que es la mas cercana en la jerarquia de // clases. Si quisiesemos ejecutar la de Empleado, escribiriamos // ct.Empleado::Ver(). Cuando implementemos ComercialTienda::Ver(), // con ct.Ver() ejecutaremos esa, y las otras dos, que estaran // ocultas, las podremos ejecutar haciendo ct.Empleado::Ver() o // ct.Comercial::Ver(). }; #endif