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)
有小费吗?
如果你知道你确实已经检索到了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<>()
普通指针一样的东西.
这是一个现场演示
你可以用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)
归档时间: |
|
查看次数: |
204 次 |
最近记录: |