shared_ptr <base />和派生类中的对象

时间:2016-04-16 23:48:02

标签: c++ c++11 shared-ptr

考虑到这样的事情:

def create
  climates = ["beachy", "very cold", "dry", "tundra", "rain forest", "north pole"]

  destination = Destination.create {{name: Faker::Name.last_name + " Island", climate: climates.sample}}

  redirect_to destinations_path
end

在我的代码中,使用class Base {...}; class D1 : public Base {...}; class D2 : public Base {...}; 管理生命周期并传递std::shared_ptr<Base>D1类型的对象是否合法?或者这会导致一个痛苦的世界?

3 个答案:

答案 0 :(得分:2)

是的,完全没问题。智能指针设计为转储指针的直接替换。

当然,您必须考虑是否制作Base的成员函数virtual,就像使用哑指针一样。

答案 1 :(得分:1)

如果您的类是为多态设计的,那么这是完全正常的。

如果您的类不是多态的(即没有虚拟成员),则此构造可能需要额外的工作(当您调用成员函数时,每个对象都将像处理Base对象一样处理)。在这种情况下,您最好在需要时使用std::shared_ptr<Base>std::shared_ptr<D1>std::shared_ptr<D2> ...和static_pointer_cast<>

答案 2 :(得分:1)

如果可以执行以下操作

Base* ptr_base = new Derived()

然后以下也应该是真的

std::shared_ptr<Derived> ptr_derived = std::make_shared<Derived>();
std::shared_ptr<Base> ptr_base = ptr_derived;
// The shared pointer count is 2 as logically there are 2 handles to
// to the same memory object.

在此之后,基本共享指针可用于运行时多态,因为我们以前使用原始指针。