¿Cómo implemento el polimorfismo con std :: shared_ptr?
He visto algunas de las otras preguntas sobre este tema, pero aún no he encontrado la respuesta, creo que me falta algo:
Definí dos clases de prueba simples:
class TestBase
{
public:
TestBase ( ) { };
~ TestBase ( ) { };
protected:
inline virtual int getInt ( )
{
return 0;
}
};
class TestDerived : public TestBase
{
protected:
inline int getInt ( ) override
{
return 1;
}
};
Declaré typedefs para simplificar su uso constd::shared_ptr:
typedef std::shared_ptr<TestBase> spBase;
typedef std::shared_ptr<TestDerived> spDerived;
Problema: no puedo compilar código para usarlosshared_ptr
declaraciones polimórficas, aunquebase
en todos estos casos es en realidad una instancia despDerived
:
spBase base;
spDerived derived = static_cast < spDerived > ( base );
error: no hay función coincidente para la llamada a ‘std :: shared_ptr :: shared_ptr (spBase &)
spDerived derived = dynamic_cast < spDerived > ( base );
error: no puede Dynamic_cast ‘base’ (de tipo ‘spBase {aka class std :: shared_ptr}’) para escribir ‘spDerived {aka class std :: shared_ptr}’ (el destino no es puntero ni referencia)
spDerived derived = static_pointer_cast < spDerived > ( base );
error: conversión de 'std :: shared_ptr>' a tipo no escalar 'spDerived {aka std :: shared_ptr}' solicitado
spDerived derived = dynamic_pointer_cast < spDerived > ( base );
error: conversión de 'std :: shared_ptr>' a tipo no escalar 'spDerived {aka std :: shared_ptr}' solicitado
Estoy usando C ++ 11 en un cuadro de Ubuntu 14.04 con la cadena de herramientas GCC predeterminada. El compilador es gcc-4.9. ¿Qué estoy haciendo mal? ¿No se puede usar un shared_pointer polimórficamente?