从模板化的派生类强制转换为模板基类

cast from templated derived class to template base class

本文关键字:转换 基类 派生      更新时间:2023-10-16

我正在实现一个shared_pointer模板,它包含一个指向typename T的指针我想实现一个复制构造函数(带有基类(T)的指针),它接收一个共享指针类(包含指向派生类(O)的指针)。我怎么能从基础类型转换到shared_ptr接收指针?

template <typename T>
class Shared_Ptr
{
public:
    template <typename O>friend class Shared_Ptr;    
    template <typename O>
    Shared_Ptr(const Shared_Ptr<O>& other_);
private:
    struct PtrVal
    {
        PtrVal(T* ptr);
        ~PtrVal();
        T *m_ptr;
        size_t m_count;
    };
    PtrVal *m_val;  
};

如何实现复制构造函数??

template <typename T>
template <typename O>
Shared_Ptr<T>::Shared_Ptr(const Shared_Ptr<O>& other_): 
m_val(static_cast<const Shared_Ptr<T> >(other_).m_val)
{}

编译,但在运行时给出分段错误(核心转储)。

我找到了另一个解决方案,但它真的很丑:我将m_ptr (other_)转换为T*(而不是O*),然后将m_val (O)转换为m_val (T

)
Shared_Ptr<T>::Shared_Ptr(const Shared_Ptr<O>& other_)
{
    if(dynamic_cast<T *>(other_.m_val->m_ptr))
    {}
    m_val = (Shared_Ptr<T>::PtrVal *)other_.m_val;
}
有什么更好的建议吗?谢谢你

您想转换m_ptr,而不是other_,因为Shared_Ptr<O>Shared_Ptr<T>没有继承关系。

template <typename T>
template <typename O>
Shared_Ptr<T>::Shared_Ptr(const Shared_Ptr<O>& other_):
    m_val (static_cast<T*>(other_.m_val->m_ptr))
{}

您还必须更新计数器