Ich habe einige der anderen Fragen zu diesem Thema gesehen, aber haben noch nicht gefunden die Antwort - ich glaube, ich bin etwas fehlt:Wie implementiere ich Polymorphie mit std :: shared_ptr?
ich 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 erklärte typedefs ihre Nutzung mit std::shared_ptr:
typedef std::shared_ptr<TestBase> spBase;
typedef std::shared_ptr<TestDerived> spDerived;
Problem zu vereinfachen: ich kann nicht Code kompilieren können diese shared_ptr
Erklärungen verwenden polymorphi nisch, obwohl base
in all diesen Fällen ist tatsächlich eine Instanz von spDerived
:
spBase base; spDerived derived = static_cast <spDerived> (base);
error: no matching function for call to ‘std::shared_ptr::shared_ptr(spBase&)
spDerived derived = dynamic_cast <spDerived> (base);
error: cannot dynamic_cast ‘base’ (of type ‘spBase {aka class std::shared_ptr}’) to type ‘spDerived {aka class std::shared_ptr}’ (target is not pointer or reference)
spDerived derived = static_pointer_cast <spDerived> (base);
error: conversion from ‘std::shared_ptr >’ to non-scalar type ‘spDerived {aka std::shared_ptr}’ requested
spDerived derived = dynamic_pointer_cast <spDerived> (base);
error: conversion from ‘std::shared_ptr >’ to non-scalar type ‘spDerived {aka std::shared_ptr}’ requested
ich mit der Standard-GCC-Toolkette C++ 11 auf eine Ubuntu 14.04 Box bin mit. Compiler ist gcc-4.9. Was mache ich falsch? Kann ein shared_pointer nicht polymorph verwendet werden?
'static_pointer_cast (Basis)' –
Aus diesem Grund typedefs wie das eine schreckliche Idee sind. Sie machen Code nur sehr viel verwirrender. – Puppy
@Puppy - Ich hasse so viel tippen, aber ich fürchte, Sie haben Recht. – Vector