Tip Corto: Enmascarimiento (casting) de un smart pointer de una clase base a una derivada

by Jorge Machin on January 8, 2009 · 0 comments

in C/C++, Tip corto

Supongamos que tenemos las siguientes clases:

#include <iostream>

#include <boost/shared_ptr.hpp>

using namespace std;

class Base {

  public:

    virtual void imprime() { cout <<"Función imprime de la Clase Base" <<endl; }

    virtual ~Base() { cout <<"Destructor de la Clase Base" <<endl; }

};

typedef boost::shared_ptr<Base> base_ptr;

class Derivada : public Base {

  public:

    virtual void imprime() { cout <<"Función imprime de la Clase Derivada" <<endl; }

    virtual ~Derivada() { cout <<"Destructor de la Clase Derivada" <<endl; }

};

typedef boost::shared_ptr<Derivada> derivada_ptr;

Y queremos hacer esto:

int main() {

  derivada_ptr derivada( new Derivada );

  base_ptr base( derivada );

  base->imprime();

  //  La siguiente línea no va a compilar:

  derivada_ptr regreso( base );

  return EXIT_SUCCESS;

}

En la tercera declaración, nos va a marcar este error al compilar:

/usr/include/boost/shared_ptr.hpp:194: error: conversión inválida de ‘Base* const’ a ‘Derivada*’

Obviamente, necesitamos un casting. La forma para hacerlo sería así:

int main() {

  derivada_ptr derivada( new Derivada );

  base_ptr base( derivada );

  base->imprime();

  //  Ahora si compila:

  derivada_ptr regreso(  boost::static_pointer_cast<Derivada>( base ) );

  return EXIT_SUCCESS;

}

Al ejecutar el programa, obtenemos esta salida:

Función imprime de la Clase Derivada
Destructor de la Clase Derivada
Destructor de la Clase Base

Como se ve, el smart pointer funcionó a la perfección a pesar de todas las transformaciones.

Leave a Comment

Previous post:

Next post: