c++ compiler-errors shared-ptr dynamic-cast

C++: "... no es un tipo polimórfico" al usar boost:: dynamic_pointer_cast



compiler-errors shared-ptr (3)

¿Por qué recibo el siguiente error para el siguiente código?

1>C:/Libs/boost_1_44/boost/smart_ptr/shared_ptr.hpp(259): error C2683: ''dynamic_cast'' : ''my_namespace::A'' is not a polymorphic type 1> D:/[location]/[header_filename].h(35) : see declaration of ''my_namespace::A'' 1> C:/Libs/boost_1_44/boost/smart_ptr/shared_ptr.hpp(522) : see reference to function template instantiation ''boost::shared_ptr<T>::shared_ptr<my_namespace::A>(const boost::shared_ptr<my_namespace::A> &,boost::detail::dynamic_cast_tag)'' being compiled 1> with 1> [ 1> T=my_namespace::B 1> ] 1> [location]/[source_filename].cpp(217) : see reference to function template instantiation ''boost::shared_ptr<T> boost::dynamic_pointer_cast<my_namespace::B,striker::A>(const boost::shared_ptr<my_namespace::A> &)'' being compiled 1> with 1> [ 1> T=my_namespace::B 1> ] 1>C:/Libs/boost_1_44/boost/smart_ptr/shared_ptr.hpp(260): fatal error C1903: unable to recover from previous error(s); stopping compilation

El código C ++ es más o menos el siguiente:

#include <list> #include "boost/pointer_cast.hpp" #include "boost/shared_ptr.hpp" struct A { public: A(const MyEnum an_enum_, const int an_int_) : an_enum(an_enum_), an_int(an_int_) {} const MyEnum an_enum; const int an_int; }; struct B : public A { public: B(const int some_int_, const MyStruct &a_struct_) : A(ENUM_OPTION_A, an_int_), a_struct(a_struct_) {} const MyStruct a_struct; }; // Ussage in some function: // ... boost::shared_ptr<A> a_ptr = boost::shared_ptr<A>( new B() ); std::list<boost::shared_ptr<A>> a_list; a_list.push_back(a_ptr); // ... boost::shared_ptr<A> a_ptr2 = a_list.front(); boost::shared_ptr<B> b_ptr = boost::dynamic_pointer_cast<B>(a_ptr2); // <-- error here // ...


''dynamic_cast'' : ''my_namespace::A'' is not a polymorphic type porque no define ni hereda una sola función virtual . Solo agrega un destructor virtual y estarás bien.

dynamic_cast funciona solo para tales tipos ''polimórficos''.


dynamic_cast funciona SOLO con clase polimórfica. Y la clase polymorphic es aquella que tiene al menos una función virtual , incluso si es el destructor.

//polymorphic classes struct A { virtual ~A(); //even virtual destructor makes a class polymorphic! }; struct B : A { void f(); }; //non-polymorphic classes struct C { ~C(); //not virtual }; struct D : C { void f(); //not virtual either };

En el código anterior, A y B son clases polimórficas, pero C y D no lo son.

A *pA = new B(); B *pB = dynamic_cast<B*>(pA); //okay C *pC = new D(); D *pD = dynamic_cast<D*>(pC); //error - not polymorphic class

Tenga en cuenta que en dynamic_cast , solo el tipo de fuente debe ser polimórfico para poder compilar. Si el destino no es polimórfico , dynamic_cast devolverá un puntero nulo.

D *pD = dynamic_cast<D*>(pA); //okay - source (pA) is polymorphic if ( pD ) cout << "pD is not null" ; else cout << "pD is null";

Salida:

pD is null

Demostración en línea: https://web.archive.org/web/20000000000000/http://www.ideone.com/Yesxc


struct A no tiene métodos virtuales (ni siquiera un destructor), por lo que no puede dynamic_cast desde A* ; solo los punteros a los tipos con al menos una función miembro virtual se pueden usar con dynamic_cast . boost::dynamic_pointer_cast hace dynamic_cast en dynamic_cast interior, sujeto a los mismos requisitos.