Мне кажется, что этот вопрос уже задан, но я не могу найти его на SO, и я не могу найти что-нибудь полезное в Google. Может быть, "ковариант" - это не то слово, которое я ищу, но это понятие очень похоже на ковариантные типы возврата на функции, поэтому я думаю, что это, вероятно, правильно. Вот что я хочу сделать, и это дает мне ошибку компилятора:
class Base;
class Derived : public Base;
SmartPtr<Derived> d = new Derived;
SmartPtr<Base> b = d; // compiler error
Предположим, что эти классы полностью сведены... Я думаю, вы поняли эту идею. Он не может преобразовать a SmartPtr<Derived>
в SmartPtr<Base>
по какой-то неясной причине. Я помню, что это нормально в С++ и многих других языках, хотя на данный момент я не могу вспомнить, почему.
Мой корневой вопрос: какой лучший способ выполнить эту операцию назначения? В настоящее время я вытаскиваю указатель из SmartPtr
, явно повышая его до базового типа, а затем перенося его в новый SmartPtr
соответствующего типа (обратите внимание, что это не утечка ресурсов, потому что наши доморощенные SmartPtr
использует интрузивный подсчет ссылок). Это долго и беспорядочно, особенно когда мне нужно обернуть SmartPtr
в еще один объект... любые ярлыки?