Умные указатели и полиморфизм - PullRequest
2 голосов
/ 21 апреля 2010

Я реализовал указатели подсчета ссылок (в примере это называется 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 ]

6 голосов
/ 21 апреля 2010

Достаточно очевидно:

SP<DerivedClass> retPtr = new DerivedClass();

должно быть:

SP<BaseClass> retPtr = new DerivedClass();
4 голосов
/ 21 апреля 2010

Вы должны добавить конструктор неявного преобразования для SP<T>:

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

   //....
private:
   T * px;
}
0 голосов
/ 21 апреля 2010

В дополнение к конструктору копирования:

SP(const SP<T>& ref);

вам нужен конструктор преобразования:

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

В противном случае компилятор не будет знать, как построить SP<BaseClass> из SP<DerivedClass>; для него они не связаны.

Конструктор преобразования довольно тривиален, поскольку внутренне вы можете автоматически конвертировать *DerivedClass в *BaseClass. Код может быть очень похож на код для конструктора копирования.

0 голосов
/ 21 апреля 2010

Почему бы не добавить оператор присваивания шаблона:

template <class Base>
class SP
{
    ...

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

(а может и конструктор копирования тоже)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...