智能指针和多态性

时间:2010-04-21 11:48:42

标签: c++ templates polymorphism smart-pointers

我实现了引用计数指针(在示例中称为SP)并且我遇到了多态性问题,我认为我不应该这样做。

在以下代码中:

    SP<BaseClass> foo()
    {   
        // Some logic...
        SP<DerivedClass> retPtr = new DerivedClass();
        return retPtr;
    }

DerivedClass继承自BaseClass。使用普通指针这应该有效,但是使用智能指针它会显示"cannot convert from 'SP<T>' to 'const SP<T>&",我认为它指的是智能指针的复制构造函数。

如何通过引用计数指针允许这种多态性? 我很欣赏代码示例,如果我遇到这个问题,显然我在这里做错了。

PS:请不要告诉我使用带有智能指针的标准库,因为此时此刻不可能。

4 个答案:

答案 0 :(得分:6)

相当明显:

SP<DerivedClass> retPtr = new DerivedClass();

应该是:

SP<BaseClass> retPtr = new DerivedClass();

答案 1 :(得分:4)

您应该为SP<T>添加隐式转换构造函数:

template<class T>
struct SP {
   /// ......
   template<class Y>
   SP( SP <Y> const & r )
    : px( r.px ) // ...
    {
    }

   //....
private:
   T * px;
}

答案 2 :(得分:0)

为什么不添加模板赋值运算符:

template <class Base>
class SP
{
    ...

    template<class Derived>
    operator = (SP<Derived>& rhs)
    {
        ...

(也许复制构造函数)?

答案 3 :(得分:0)

除了复制构造函数:

SP(const SP<T>& ref);

你需要一个转换构造函数:

template<typename T2>
SP(const SP<T2>& ref);

否则,编译器将不知道如何从SP<BaseClass>构造SP<DerivedClass>;对他而言,他们是无关的。

转化构造函数相当简单,因为您可以在内部自动将*DerivedClass转换为*BaseClass。代码可能与复制构造函数的代码非常相似。