Как мне реализовать полиморфизм с помощью std :: shared_ptr?

Я видел некоторые другие вопросы по этой теме, но до сих пор не нашел ответа - думаю, я что-то упустил:

Я определил два простых тестовых класса:

class TestBase
{

  public:

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

  protected:

    inline virtual int getInt ( )
    {
        return 0;
    }

};

class TestDerived : public TestBase
{

  protected:

    inline int getInt ( ) override
    {
        return 1;
    }

};

Я объявил typedefs, чтобы упростить их использование сstd::shared_ptr:

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

Проблема: я не могу скомпилировать код для использования этихshared_ptr декларации полиморфно, хотяbase во всех этих случаях на самом деле является примеромspDerived:

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

ошибка: нет соответствующей функции для вызова ‘std :: shared_ptr :: shared_ptr (spBase &)

spDerived derived = dynamic_cast < spDerived > ( base );

ошибка: невозможно выполнить динамическую трансляцию «base» (типа «spBase {aka class std :: shared_ptr}») для «spDerived {aka class std :: shared_ptr}» (цель не указатель или ссылка)

spDerived derived = static_pointer_cast < spDerived > ( base );

ошибка: запрошено преобразование из ‘std :: shared_ptr> ’в нескалярный тип‘ spDerived {aka std :: shared_ptr} ’

spDerived derived = dynamic_pointer_cast < spDerived > ( base );

ошибка: запрошено преобразование из ‘std :: shared_ptr> ’в нескалярный тип‘ spDerived {aka std :: shared_ptr} ’

Я использую C ++ 11 на Ubuntu 14.04 с цепочкой инструментов GCC по умолчанию. Компилятор gcc-4.9. Что я делаю неправильно? Разве shared_pointer не может быть использован полиморфно?

Ответы на вопрос(1)

Ваш ответ на вопрос