ayuda memoria sobre conversion dinamica descendente y polimorfismo

#include <iostream>
using std::cout;
using std::endl;
using std::fixed;

#include <string>

#include <iomanip>
using std::setw;

#include <cstdlib>
#include <vector>

#include <typeinfo>
using namespace std;


class Animal
{
public:
    Animal( int e ){ this->edad = e; }

    virtual void moverse() const = 0;
    virtual int get_edad() const = 0;

protected:
    double edad;
};


class Persona: public Animal
{
public:
    Persona( int edad = 0, const std::string& n = "" ):Animal( edad ){ nombre = n; }

    virtual void moverse() const { cout << "persona caminando..."; }
    virtual int get_edad() const { return edad; }

    std::string get_nombre() const { return nombre; }

private:
    std::string nombre;
};

class Ballena: public Animal
{
public:
    Ballena( int edad = 0 ):Animal( edad ){ }

    virtual void moverse() const { cout << "Ballena nadando..."; }
    virtual int get_edad() const { return edad; }
};

class Pajaro: public Animal
{
public:
    Pajaro( int e ):Animal( e ){};

    virtual void moverse() const { cout << "pajaro volando..."; }
    virtual int get_edad() const { return edad; }
};

void mostrar_coleccion( const std::vector< Animal* > vect )
{
    // muestra el contenido del vector
    for( size_t i = 0; i < vect.size(); i++ )
        vect.at( i )->moverse();

    // los objetos del vector que sean personas son procesadas
    for( size_t i = 0; i < vect.size(); i++ )
    {
        // conversion dinamica desecendente
        Persona* auxPtr = dynamic_cast< Persona* >( vect.at( i ) ) ;

        // si la conversion fue exitosa entonces procesa el objeto
        if( auxPtr != 0 )
            cout << auxPtr->get_nombre() << endl;
    }

    // elimina los elementos del vector
    for( size_t j = 0; j < vect.size(); j++ )
    {
        cout << "eliminando: " << typeid( *vect.at(j) ).name() << endl;
        delete vect.at( j );
    }

};

int main()
{
    std::vector< Animal* > ptrAnimalVect;
    ptrAnimalVect.resize( 4 );

    ptrAnimalVect.at( 0 ) = new Persona( 15, "marcela" );
    ptrAnimalVect.at( 1 ) = new Ballena( 4 );
    ptrAnimalVect.at( 2 ) = new Pajaro( 1 );
    ptrAnimalVect.at( 3 ) = new Persona( 32, "vladimiro");

    mostrar_coleccion( ptrAnimalVect );
    ptrAnimalVect.clear();

    return 0;
}

Comentarios

Entradas populares de este blog

El juego del ahorcado, escrito en assembler i8086

Una posible implementacion en modo texto de una sopa de letras con python ( 2013 )