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?