using namespace boost;
class A {};
class B : public A {};
class X {
virtual shared_ptr<A> foo();
};
class Y : public X {
virtual shared_ptr<B> foo();
};
Типы возврата не являются ковариантными (ни они, поэтому, законный), но они были бы то, если бы я использовал необработанные указатели вместо этого. Что обычно принимаемая идиома должна работать вокруг этого, если существует тот?
Я думаю, что решение принципиально невозможно, потому что ковариация зависит от арифметики указателей, что несовместимо с интеллектуальными указателями.
Когда Y :: foo
возвращает shared_ptr
динамическому вызывающему объекту, он должен быть приведен к shared_ptr
перед использованием. В вашем случае B *
можно (вероятно) просто переинтерпретировать как A *
, но для множественного наследования вам понадобится некоторая магия, чтобы сообщить C ++ о static_cast < A *> (shared_ptr :: get ())
.