¿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&nbsp;declaraciones polimórficas, aunquebase&nbsp;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?