std::shared_ptr是如何多态的

How is std::shared_ptr polymorphic?

本文关键字:多态 何多态 shared ptr std      更新时间:2023-10-16

我正在开发一些容器类,它有类似的想法:将指针放在里面。

#include <iostream>
template<class T>
class Container
{
public:
    Container ( )
    {
         pointer = new T ( );
    }
    ~Container ( )
    {
        delete pointer;
    }
    T* operator->( )
    {
        return pointer;
    }
private:
     T* pointer;
};
struct Base
{
    virtual void who ( )
    {
        std::cout << "Base" << std::endl;
    }
};

struct Child : public Base
{
    virtual void who ( ) override
    {
        std::cout << "Child" << std::endl;
    }
};
void testContainer ( Container<Base> c )
{
    c->who ( );
}
void testSharedPtr ( std::shared_ptr<Base> s )
{
    s->who ( );
}
int main ( )
{
    Container<Child> child;
    std::shared_ptr<Child> sharedChild;
    testSharedPtr ( sharedChild );
    testContainer ( child );
}

此代码编译失败:error C2664: 'void test(Container<Base> &)' : cannot convert argument 1 from 'Container<Child>' to 'Container<Base> &'
然而,使用std::shared_ptr<Base>而不是Container,一切都可以正常工作。所以问题是:
类似于std::shared_ptr多形体瘤是可实现的吗?或者这个特性是用C++硬编码的?抱歉我的原始语言。

实现以下构造函数:

template<class Other,
         class = typename std::enable_if<std::is_convertible<Other*, T*>::value>::type>
Container(const Container<Other>& _Other) 
{
    pointer = _Other.pointer;
}

只有当Other*可转换为T*时,才会启用此构造函数,如果TOther的基类,则情况显然如此。