shared_ptr<Base> 和派生的对象 类
shared_ptr<Base> and objects from derived classes
给出这样的东西:
class Base {...};
class D1 : public Base {...};
class D2 : public Base {...};
在我的代码中,使用 std::shared_ptr<Base>
来管理生命周期并传递 D1
和 D2
类型的对象是否合法?还是这会导致一个痛苦的世界?
是的,完全没问题。智能指针旨在替代转储指针。
当然要考虑要不要做Base的成员函数virtual
,就跟dumb指针一样
如果您的 类 是为多态设计的,这完全没问题。
如果您的 类 不是多态的(即没有虚拟成员),则此构造可能需要额外的工作(当您调用成员函数时,每个对象都将被视为 Base 对象)。在这种情况下,您最好在需要时使用 std::shared_ptr<Base>
、std::shared_ptr<D1>
、std::shared_ptr<D2>
... 和 static_pointer_cast<>
。
如果可以做到以下几点
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.
在此之后,基础共享指针可用于 运行 时间多态性,就像我们过去使用原始指针一样。
给出这样的东西:
class Base {...};
class D1 : public Base {...};
class D2 : public Base {...};
在我的代码中,使用 std::shared_ptr<Base>
来管理生命周期并传递 D1
和 D2
类型的对象是否合法?还是这会导致一个痛苦的世界?
是的,完全没问题。智能指针旨在替代转储指针。
当然要考虑要不要做Base的成员函数virtual
,就跟dumb指针一样
如果您的 类 是为多态设计的,这完全没问题。
如果您的 类 不是多态的(即没有虚拟成员),则此构造可能需要额外的工作(当您调用成员函数时,每个对象都将被视为 Base 对象)。在这种情况下,您最好在需要时使用 std::shared_ptr<Base>
、std::shared_ptr<D1>
、std::shared_ptr<D2>
... 和 static_pointer_cast<>
。
如果可以做到以下几点
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.
在此之后,基础共享指针可用于 运行 时间多态性,就像我们过去使用原始指针一样。