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