3ª Práctica: Composición y Herencia múltiple

    Exploración en detalle de la herencia en C++. Características de la herencia múltiple.

Bibliografía y links de la práctica

    (Stroustrup, B. 1991)
    (Ellis, M., Stroustrup, B. 1990)
    Iniciación rápida a C++

Conocimientos necesarios

Texto de la práctica


    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?