Как мне реализовать полиморфизм с помощью 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 не может быть использован полиморфно?