将智能指针转换为基数 class

Casting smartpointers to base class

如果 class B 派生自 class A,我可以 dynamic_cast 一个 shared_ptr<B> 到一个 shared_ptr<A>,以及从 shared_ptr<A> 到一个 shared_ptr<B>?

我只是问自己,因为使用 dynamic cast 你可以在 Java 中做类似 instanceof 的事情。我问自己这是否也适用于 smart_ptr.

对于从派生 class 转换为基础 class 的特殊情况,可以使用赋值运算符为您执行必要的隐式转换。对于另一个方向,您可以使用 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