【问题标题】:Casting smartpointers to base class将智能指针转换为基类
【发布时间】:2016-04-07 22:46:42
【问题描述】:
如果class B 派生自class A,我可以将dynamic_cast shared_ptr<B> 转换为shared_ptr<A>,并从shared_ptr<A> 转换为shared_ptr<B>?
我只是问自己,因为使用dynamic cast,您可以在 Java 中执行类似 instanceof 的操作。我问自己这是否也适用于smart_ptr。
【问题讨论】:
标签:
c++11
inheritance
casting
smart-pointers
【解决方案1】:
对于从派生类转换为基类的特殊情况,可以使用赋值运算符为您进行必要的隐式转换。对于另一个方向,您可以使用 dynamic_pointer_cast。
#include <memory>
struct A { virtual ~A() = 0; };
struct B: A { };
void example()
{
// derived to base
std::shared_ptr<B> b;
std::shared_ptr<A> a = b;
// base to derived
std::shared_ptr<A> a2;
std::shared_ptr<B> b2 = std::dynamic_pointer_cast<B>(a2);
}
有关铸造操作的更多信息,请参阅 http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast - 对于所有常见的嫌疑人,如 reinterpret_pointer_cast 等都有等价物。