std :: shared_ptr upcasting到基类 - 最好的方法?

Pio*_*ach 15 c++ shared-ptr

哪种转换更好,有什么区别?

class Base
{};

class Derived : public Base, public std::enable_shared_from_this<Derived>
{};

int main(int argc, const char * argv[])
{
    std::shared_ptr<Base> ptr1 = std::dynamic_pointer_cast<Base>(std::shared_ptr<Derived>(new Derived())); // version 1
    std::shared_ptr<Base> ptr2 = std::shared_ptr<Derived>(new Derived()); // version 2
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Com*_*sMS 16

与其他用例一样shared_ptr,您应该更喜欢使用make_shared而不是shared_ptr手动构建:

std::shared_ptr<Base> ptr2 = std::make_shared<Derived>();
Run Code Online (Sandbox Code Playgroud)

这基本上是你的版本2,加上各种好处make_shared.

版本1做了一堆不必要的东西:首先你构造一个临时的shared_ptr<Derived>,然后你dynamic_cast的内容到一个基类指针(虽然static_cast这里就足够了),然后你将该指针存储在另一个shared_ptr<Base>.因此,您有许多不必要的运行时操作,但没有类型安全性优于第2版.