2

我实现了引用计数指针(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

4 回答 4

6

相当明显:

SP<DerivedClass> retPtr = new DerivedClass();

应该:

SP<BaseClass> retPtr = new DerivedClass();
于 2010-04-21T11:50:34.670 回答
4

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

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

   //....
private:
   T * px;
}
于 2010-04-21T11:58:18.510 回答
0

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

template <class Base>
class SP
{
    ...

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

(也许还有复制构造函数)?

于 2010-04-21T11:57:02.850 回答
0

除了复制构造函数:

SP(const SP<T>& ref);

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

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

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

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

于 2010-04-21T12:01:03.213 回答