我实现了引用计数指针(在示例中称为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:请不要告诉我使用带有智能指针的标准库,因为此时此刻不可能。
答案 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
。代码可能与复制构造函数的代码非常相似。