C++中的dynamic_pointer_cast有什么用?什么时候使用? Dynamic_pointer_cast 的替代方案是什么?

问题描述 投票:0回答:1

我正在阅读有关

dynamic_pointer_cast
的内容。

我发现我们可以在运行时动态地将一种类型的共享指针向上或向下转换为另一种类型,但是

我没有完全理解这个概念。

两个类必须具有相同的属性吗?

如果属性必须相同,那么什么需要动态铸造?

c++
1个回答
5
投票

dynamic_pointer_cast
用于转换
std::shared_ptr
类型,例如从基类上的指针到派生类上的指针:

#include <memory>

struct A{ virtual ~A() = default; };
struct B: A {};

int main()
{
    std::shared_ptr<A> pA = std::make_shared<B>();
    std::shared_ptr<B> pB = std::dynamic_pointer_cast<B>(pA);
}

所以

dynamic_pointer_cast
dynamic_cast
的便捷包装:

template< class T, class U > 
std::shared_ptr<T> dynamic_pointer_cast( const std::shared_ptr<U>& r ) noexcept
{
    if (auto p = dynamic_cast<typename std::shared_ptr<T>::element_type*>(r.get())) {
        return std::shared_ptr<T>{r, p};
    } else {
        return std::shared_ptr<T>{};
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.