У меня есть такой код:
class RetInterface {...}
class Ret1: public RetInterface {...}
class AInterface
{
public:
virtual boost::shared_ptr<RetInterface> get_r() const = 0;
...
};
class A1: public AInterface
{
public:
boost::shared_ptr<Ret1> get_r() const {...}
...
};
Этот код не компилируется.
В визуальной студии это поднимает
C2555: переопределение типа возвращаемой виртуальной функции отличается и не является ковариантным
Если я не использую boost::shared_ptr
но возвращаю необработанные указатели, код компилируется (я понимаю, это связано с ковариантными типами возврата в C++). Я вижу проблему в том, что boost::shared_ptr
из Ret1
не является производным от boost::shared_ptr
из RetInterface
. Но я хочу вернуть boost::shared_ptr
из Ret1
для использования в других классах, иначе я должен привести приведенное значение после возврата.
- Я делаю что-то неправильно?
- Если нет, то почему язык таков - он должен быть расширяемым для обработки преобразования между умными указателями в этом сценарии? Есть ли желательный обходной путь?