Wie implementiere ich Polymorphismus mit std :: shared_ptr?

Ich habe einige der anderen Fragen zu diesem Thema gesehen, aber immer noch keine Antwort gefunden - ich vermute, ich vermisse etwas:

Ich habe zwei einfache Testklassen definiert:

class TestBase
{

  public:

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

  protected:

    inline virtual int getInt ( )
    {
        return 0;
    }

};

class TestDerived : public TestBase
{

  protected:

    inline int getInt ( ) override
    {
        return 1;
    }

};

Ich habe typedefs deklariert, um ihre Verwendung mit @ zu vereinfachestd::shared_ptr:

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

Problem: Ich kann keinen Code kompilieren, um diese @ zu verwendshared_ptr Deklarationen polymorph, obwohlbase in all diesen Fällen ist tatsächlich eine Instanz vonspDerived:

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

error: Keine passende Funktion für den Aufruf von ‘std :: shared_ptr :: shared_ptr (spBase &)

spDerived derived = dynamic_cast < spDerived > ( base );

error: dynamic_cast "base" (vom Typ "spBase {aka class std :: shared_ptr}") kann nicht "spDerived {aka class std :: shared_ptr}" eingeben (Ziel ist kein Zeiger oder Verweis)

spDerived derived = static_pointer_cast < spDerived > ( base );

error: Konvertierung von "std :: shared_ptr>" in den nicht skalaren Typ "spDerived {aka std :: shared_ptr}" angefordert

spDerived derived = dynamic_pointer_cast < spDerived > ( base );

error: Konvertierung von "std :: shared_ptr>" in den nicht skalaren Typ "spDerived {aka std :: shared_ptr}" angefordert

Ich verwende C ++ 11 auf einer Ubuntu 14.04-Box mit der Standard-GCC-Toolkette. Compiler ist gcc-4.9. Was mache ich falsch? Kann ein shared_pointer nicht polymorph verwendet werden?