Como implementar o polimorfismo com std :: shared_ptr?

Vi outras perguntas sobre esse tópico, mas ainda não encontrei a resposta - acho que estou perdendo alguma coisa:

Eu defini duas classes de teste simples:

class TestBase
{

  public:

    TestBase ( ) { };
    ~ TestBase ( ) { };

  protected:

    inline virtual int getInt ( )
    {
        return 0;
    }

};

class TestDerived : public TestBase
{

  protected:

    inline int getInt ( ) override
    {
        return 1;
    }

};

Eu declarei typedefs para simplificar seu uso comstd::shared_ptr:

typedef std::shared_ptr<TestBase> spBase;
typedef std::shared_ptr<TestDerived> spDerived;

Problema: Não consigo compilar código para usar essesshared_ptr declarações polimorficamente, emborabase em todos esses casos é realmente uma instância despDerived:

spBase base;
spDerived derived = static_cast < spDerived > ( base );

erro: nenhuma função correspondente para chamar ‘std :: shared_ptr :: shared_ptr (spBase &)

spDerived derived = dynamic_cast < spDerived > ( base );

erro: não é possível dynamic_cast 'base' (do tipo 'spBase {aka class std :: shared_ptr}') para digitar 'spDerived {aka class std :: shared_ptr}' (o destino não é ponteiro ou referência)

spDerived derived = static_pointer_cast < spDerived > ( base );

erro: conversão de 'std :: shared_ptr>' para não escalar 'spDerived {aka std :: shared_ptr}' solicitado

spDerived derived = dynamic_pointer_cast < spDerived > ( base );

erro: conversão de 'std :: shared_ptr>' para não escalar 'spDerived {aka std :: shared_ptr}' solicitado

Estou usando C ++ 11 em uma caixa Ubuntu 14.04 com a cadeia de ferramentas GCC padrão. O compilador é gcc-4.9. O que estou fazendo errado? Não é possível usar um ponteiro compartilhado polimorficamente?

questionAnswers(1)

yourAnswerToTheQuestion