Exploración en detalle de la herencia en C++. Características de la herencia múltiple.
(Stroustrup, B. 1991)
(Ellis, M., Stroustrup, B.
1990)
Iniciación
rápida a C++
Conocimientos necesarios
1. Utilizando como referencia la clase empleado
de la
práctica anterior, créese una clase "oficina". Cada objeto
oficina podrá tener un número indeterminado de empleados. La
clase oficina, además, debe ofrecer un método que, según
el tipo de trabajo del empleado, (a,b, ó c), ofrezca por pantalla
un listado con la nómina (2 columnas: empleado y sueldo) teniendo
en cuenta que a cada tipo de empleado le corresponden 1000 EUR, 1500
EUR y 2000 EUR respectivamente. El programa debe pedir el número de
empleados,
instanciar entonces el objeto "oficina", pedir los datos de los
empleados
y visualizar la nómina.
2. Rellenar los huecos indicados como '...'
// herenciam1.cpp
#include <iostream>
#include <string>
using namespace std;
/////////////////////////////////////////////////////////////////////////////////////////
// Clase Estudiante
/////////////////////////////////////////////////////////////////////////////////////////
class Estudiante
{
...:
string
nombre;
...:
Estudiante(string nom = "") : nombre(nom) {};
const string &getNombre(void) { return ...;} const;
void
putNombre(const string &x) { ...;};
};
/////////////////////////////////////////////////////////////////////////////////////////
// Clase Profesor
/////////////////////////////////////////////////////////////////////////////////////////
class Profesor {
...:
string
nombre;
...:
Profesor(string nom = "") : nombre(nom) {};
const string &getNombre(void) { return ...;} const;
void
putNombre(const string &x) { ...;};
};
/////////////////////////////////////////////////////////////////////////////////////////
// Clase ProfesorPropio
/////////////////////////////////////////////////////////////////////////////////////////
class ProfesorPropio:
..., ...
{
.....:
ProfesorPropio(string nom = "") { putNombre(
nom ); };
const string &getNombre(void) { return ...;} const;
void
putNombre(const string &x) { ...;};
};
int main(void)
{
ProfesorPropio
p( "Marta" );
cout << p.getNombre() << endl;
}
¿Funciona?, ¿Por qué? ó ¿Por qué no?, ¿Cómo se solucionaría en el caso de que no funcionase?
¿Tiene sentido hacerlo así? ¿Qué problemas presenta la herencia múltiple (de presentar alguno)?
// herenciam2.cpp
#include <iostream>
#include <string>
using namespace std;
/////////////////////////////////////////////////////////////////////////////////////////
// Clase Persona.
/////////////////////////////////////////////////////////////////////////////////////////
class Persona {
...:
string
nombre;
...:
Persona(string nom = "") : nombre( nom ) {};
const string &getNombre(void) { return ...;} const;
void
putNombre(const string &x) { ...;};
};
/////////////////////////////////////////////////////////////////////////////////////////
// Clase Estudiante
/////////////////////////////////////////////////////////////////////////////////////////
class Estudiante : public
Persona {
...:
Estudiante(string nom = "") : Persona( nom ) { };
};
/////////////////////////////////////////////////////////////////////////////////////////
// Clase Profesor
/////////////////////////////////////////////////////////////////////////////////////////
class Profesor : public
Persona
{
...:
Profesor(string nom = "") : Persona( nom ) {};
};
/////////////////////////////////////////////////////////////////////////////////////////
// Clase ProfesorPropio
/////////////////////////////////////////////////////////////////////////////////////////
class ProfesorPropio:
..., ...
{
...:
ProfesorPropio(string nom = "") { ...; };
};
int main(void)
{
ProfesorPropio
p( "Marta" );
cout << p.getNombre() << endl;
}
¿Funciona?, ¿Por qué? ó ¿Por qué no?, ¿Cómo se solucionaría en el caso de que no funcionase?
¿Tiene sentido hacerlo así? ¿Qué problemas presenta la herencia múltiple (de presentar alguno)?
Finalmente, ¿cómo implementarías tú este problema?.
¿De esta misma forma, o de otra totalmente distinta?