哪种转换更好,有什么区别?
class Base {}; class Derived : public Base, public std::enable_shared_from_this{}; int main(int argc, const char * argv[]) { std::shared_ptr ptr1 = std::dynamic_pointer_cast (std::shared_ptr (new Derived())); // version 1 std::shared_ptr ptr2 = std::shared_ptr (new Derived()); // version 2 return 0; }
ComicSansMS.. 16
与其他用例一样shared_ptr
,您应该更喜欢使用make_shared
而不是shared_ptr
手动构建:
std::shared_ptrptr2 = std::make_shared ();
这基本上是你的版本2,加上各种好处make_shared
.
版本1做了一堆不必要的东西:首先你构造一个临时的shared_ptr
,然后你dynamic_cast
的内容到一个基类指针(虽然static_cast
这里就足够了),然后你将该指针存储在另一个shared_ptr
.因此,您有许多不必要的运行时操作,但没有类型安全性优于第2版.
与其他用例一样shared_ptr
,您应该更喜欢使用make_shared
而不是shared_ptr
手动构建:
std::shared_ptr<Base> ptr2 = std::make_shared<Derived>();
这基本上是你的版本2,加上各种好处make_shared
.
版本1做了一堆不必要的东西:首先你构造一个临时的shared_ptr<Derived>
,然后你dynamic_cast
的内容到一个基类指针(虽然static_cast
这里就足够了),然后你将该指针存储在另一个shared_ptr<Base>
.因此,您有许多不必要的运行时操作,但没有类型安全性优于第2版.