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;
}
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
Publicar un comentario