Widziałem kilka innych pytań na ten temat, ale nadal nie znalazłem odpowiedzi - Chyba jestem czegoś brakuje:Jak zaimplementować polimorfizm za pomocą std :: shared_ptr?
zdefiniowałem dwa proste zajęcia testowe:
class TestBase
{
public:
TestBase () { };
~ TestBase () { };
protected:
inline virtual int getInt ()
{
return 0;
}
};
class TestDerived : public TestBase
{
protected:
inline int getInt () override
{
return 1;
}
};
oświadczyłem typedefs uprościć ich wykorzystanie z std::shared_ptr:
typedef std::shared_ptr<TestBase> spBase;
typedef std::shared_ptr<TestDerived> spDerived;
problem: nie mogę skompilować kod do korzystania z tych deklaracji shared_ptr
polymorphi tycznie, choć base
we wszystkich tych przypadkach jest faktycznie instancja 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
Używam C++ 11 na polu Ubuntu 14.04 z łańcuchem domyślne narzędzie GCC. Kompilator to gcc-4.9. Co robię źle? Czy zmienna_społeczna nie może być używana polimorficznie?
'static_pointer_cast (baza)' –
Dlatego typedefs tak to fatalny pomysł. Sprawiają, że kod jest znacznie bardziej zagmatwany. – Puppy
@Puppy - Nienawidzę pisania za dużo, ale obawiam się, że masz rację. – Vector