2ª Práctica: Clases y Herencia

    Profundización en la implantación de Orientación a Objetos que ofrece C++:

Bibliografía y links de la práctica

    Cursillo de C++

Conocimientos necesarios

Texto de la práctica


    1. Convertir la clase del programa anterior, que implementa el Tipo Abstracto Pila, a una clase que utilice constructores y destructores cuando sea necesario.

    2. Rellenar los huecos indicados como '...'

// herencia.cpp

#include <iostream>

/////////////////////////////////////////////////////////////////////////////////////////
// Clase rectángulo.
// Lados x e y, área x* y
/////////////////////////////////////////////////////////////////////////////////////////
class Rectangulo {
    ...:
        int x,y;

    ...:
        Rectangulo(int a = 0, int b = 0) : x( a ), y( b ) {};

        int calcularArea() { return ...*...; };
 

        int getX(void) { return ...;};
        int getY(void) { return ...;};
        void putX(int a) { x = ...; };
        void putY(int b) { y = ...; };
};

/////////////////////////////////////////////////////////////////////////////////////////
// Clase cuadrado.
// Lados x e y, tal que x == y. Así, usamos sólo x. Area x * x. y herencia privada !!!
/////////////////////////////////////////////////////////////////////////////////////////
class Cuadrado : ... Rectangulo {
    ... :
        Cuadrado(int a = 0) { putX( a ); putY( 0 ); };

        int calcularArea() { int a = ...; return a * a; };

        ...
        using Rectangulo::...;
};
 

using namespace std;

int main(void)
{
    Cuadrado c1 = 4;

    cout << "El cuadrado de lado " << c1.getX()
         << endl << "tiene área "  << c1.calcularArea();

}
 

    3. Probar, si es necesario, las siguientes sentencias en el programa main() del ejemplo anterior. Indicar si compilan correctamente o no, y por qué lo hacen o no y como se corregirían en caso de que no lo hicieran. ¿Algún ejemplo compila pero no funciona adecuadamente ? ¿ Por qué ?

    a) c1.putY( 5 );
    b) Rectangulo r1;
        r1.putX( 10 );
        r1.putY( 20 );
        cout << ( r1.x * r1.y ) << endl;

    c) Cuadrado c2( 20 );
        cout << c2.calcularArea( 20, 20 ) << endl;

    d) cout << "Área: " << c1.getX() * c1.getY() << endl;

    e) Rectangulo * r2 = new Cuadrado( 20 );
        cout << "Área: " << r2->calcularArea() << endl;

    f) rectangulo * r3 = new Cuadrado( 6 );
       cout << "Lado del cuadrado: " << r3->getX();

    4. Codificar un programa que defina la clase persona, que encapsule los datos nombre y DNI. Defínase la clase empleado, heredando de persona y que encapsule a su vez el salario.
        Utilizar la STL para guardar en un vector objetos de tipo persona. Al guardar sólo punteros, pueden almacenarse punteros a persona que realmente apunten a objetos empleado, ya que el último hereda del primero.
        Una vez guardadas 10 personas, mostrar el nombre de éstas en pantalla.
        A continuación, se muestran ciertos trozos de código que realizan tareas clave con el vector que se provee en la STL.

    #include <vector>

    using namespace std;

       ...

    int main()

    {

    // Declaraciones

    vector<Persona *> gente;

    Persona *x;

    ...

    // Meter empleados  o personas en el vector, creciendo dinámicamente.
    x = new Empleado( "Pepe Pérez", 3456789, 120000 );
    gente.push_back( x );

    // Acceder al número de elementos del vector
    cout << gente.size();

    // Acceder a una posición del vector
    cout << gente[ 5 ]->getNombre() << endl;

     }