std::dynamic_pointer_cast
是 C++ 中用于在 std::shared_ptr
智能指针之间进行动态类型转换的函数模板。它位于 <memory>
头文件中,并与其他类型转换函数(如 static_pointer_cast
和 const_pointer_cast
)一起提供了方便且安全的智能指针类型转换操作。
std::dynamic_pointer_cast
可以将一个 std::shared_ptr
智能指针从一个派生类类型向另一个派生类类型进行转换,前提是这两个类之间存在继承关系。如果转换成功,将返回一个新的 std::shared_ptr
,指向目标类型的对象;如果转换失败,则返回一个空的 std::shared_ptr
。
以下是一个示例,展示了如何使用 std::dynamic_pointer_cast
进行动态类型转换:
#include <iostream>#include <memory>class Base {public: virtual void foo() { std::cout << "Base::foo()" << std::endl; }};class Derived : public Base {public: void foo() override { std::cout << "Derived::foo()" << std::endl; }};int main() { std::shared_ptr<Base> basePtr = std::make_shared<Derived>(); std::shared_ptr<Derived> derivedPtr = std::dynamic_pointer_cast<Derived>(basePtr); if (derivedPtr != nullptr) { derivedPtr->foo(); // 调用 Derived 类的 foo() 方法 } else { std::cout << "Dynamic cast failed." << std::endl; } return 0;}
在这个示例中,我们首先创建了一个指向 Derived
类对象的 std::shared_ptr<Base>
,然后使用 std::dynamic_pointer_cast
将其转换为 std::shared_ptr<Derived>
。如果转换成功,则可以通过 derivedPtr
调用 Derived
类的成员函数。
请注意,std::dynamic_pointer_cast
只能用于智能指针之间的动态类型转换,并且在进行转换时会自动检查转换的安全性。如果尝试将指向不相关类的指针进行转换,或者源指针为空指针,则返回的结果将是空指针。