C++11智能指针shared_ptr的向上转upcast向下转downcast

来源:互联网 发布:淘宝营销推广方式 编辑:程序博客网 时间:2024/05/20 16:00


#include <iostream>

#include <memory>


class A{

public:

    virtual ~A() =default;//must have a virtual otherwise complie err: not polymorphic

};

class B: public A{

};


typedef std::shared_ptr<A> APtr;

typedef std::shared_ptr<B> BPtr;


void test_pt(APtr p){

   if (BPtr b =std::dynamic_pointer_cast<B>(p)) {

       std::cout<<"bbb " << b <<std::endl;

    }

   else{

       std::cout<<"nnn" <<std::endl;

    }

}

int main(int argc,constchar * argv[])

{

   void test1();

    

   APtr a(newA());

   BPtr b(newB());

   APtr c(newB());

    

   std::cout<<std::dynamic_pointer_cast<A>(b) <<std::endl;//upcast, not 0

   std::cout<<std::dynamic_pointer_cast<B>(a) <<std::endl;//downcast, 0

   std::cout<<std::dynamic_pointer_cast<B>(c) <<std::endl;//downcast, not 0

    

   test_pt(b);

   std::cout<<"xxx " << b <<std::endl;//not 0

    

    std::cout <<"Hello, World!\n";

   return0;

}


0x100100a50

0x0

0x100100a80

bbb 0x100100a50

xxx 0x100100a50

Hello, World!

---------refernce------------------

http://msdn.microsoft.com/en-us/library/bb982967.aspx

http://stackoverflow.com/questions/14877626/up-casting-stdshared-ptr-using-stddynamic-pointer-cast