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?