如何将shared_ptr <A>转换为shared_ptr <B>,其中B是从A派生的?

Tot*_*son 2 c++ inheritance shared-ptr

我有一个std :: list容器,持有类A的共享指针.我有另一个类,比如B,它是从A派生的.

我目前有代码来填充容器:

shared_ptr<B> b = shared_ptr<B>(new B);
container.push_back(b)
Run Code Online (Sandbox Code Playgroud)

这很好用.

问题是,如何检索最初被推回容器的shared_ptr <B>?

执行以下操作

   list<shared_ptr<A> >::iter anIter = myContainer.begin();
   shared_ptr<B> aB = *(anIter);
Run Code Online (Sandbox Code Playgroud)

不编译.我收到错误

Cannot convert 'A * const' to 'B *'
Run Code Online (Sandbox Code Playgroud)

有小费吗?

Chr*_*phe 8

如果你知道你确实已经检索到了B,正如你的问题所示,那么你可以使用 static_pointer_cast<>():

    shared_ptr<B> b = shared_ptr<B>(new B);
    container.push_back(b);
    auto it = container.begin();
    shared_ptr<B> aB = static_pointer_cast<B>(*it);
    aB->showb();
Run Code Online (Sandbox Code Playgroud)

如果有疑问,你可以使用dynamic_pointer_cast<>().但与传统方法一样dynamic_cast<>(),只有当您的类具有多态性时,这才有效,即您至少有一个虚函数:

   container.push_back(make_shared<A>());
   for (auto i = container.begin(); i!=container.end(); i++) {
       shared_ptr<B> spb = dynamic_pointer_cast<B>(*i); 
       if (spb)
           spb->showb();  // at least one virtual function 
       else cout << "the pointer was not to a B"; 
   }
Run Code Online (Sandbox Code Playgroud)

该原理类似于static_cast<>()dynamic_cast<>()用于正常指针,看的dynamic_cast和的static_cast在C++中.顺便说一下,还有const_pointer_cast<>()const_cast<>()普通指针一样的东西.

这是一个现场演示


pha*_*tom 7

你可以用std::dynamic_pointer_cast.

你这样使用它:

std::shared_ptr<Base> basePtr;
std::shared_ptr<Derived> derivedPtr = std::dynamic_pointer_cast<Derived>(basePtr);
Run Code Online (Sandbox Code Playgroud)