C++: “… is not a polymorphic type” while using boost::dynamic_pointer_cast

后端 未结 3 2037
后悔当初
后悔当初 2021-01-01 14:28

Why do I receive the following error for the following code?

1>C:\\Libs\\boost_1_44\\boost/smart_ptr/shared_ptr.hpp(259): error C2683: \'dynamic_cast\' :          


        
相关标签:
3条回答
  • 2021-01-01 15:07

    'dynamic_cast' : 'my_namespace::A' is not a polymorphic type because it doesn't define or inherit a single virtual function. Just add a virtual destructor and you'll be fine.

    dynamic_cast works only for such 'polymorphic' types.

    0 讨论(0)
  • 2021-01-01 15:07

    struct A has no virtual methods (not even a destructor), so you can't dynamic_cast from A* - only pointers to types with at least one virtual member function can be used dynamic_cast on. boost::dynamic_pointer_cast does dynamic_cast inside, to it's subject to same requirements.

    0 讨论(0)
  • 2021-01-01 15:16

    dynamic_cast works ONLY with polymorphic class. And polymorphic class is that which has atleast one virtual function, even be it the 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
    };
    

    In the above code, A and B are polymorphic classes, but C and D are not.

    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
    

    Note that in dynamic_cast, only the source type need to be polymorphic in order to compile. If the destination isn't polymorphic, then dynamic_cast will return null pointer.

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

    Output:

    pD is null
    

    Online demo: https://web.archive.org/web/20000000000000/http://www.ideone.com/Yesxc

    0 讨论(0)
提交回复
热议问题