Ковариация возвращаемого типа с интеллектуальными указателями

В C ++ мы можем сделать это:

struct Base
{
   virtual Base* Clone() const { ... }
   virtual ~Base(){}
};

struct Derived : Base
{
   virtual Derived* Clone() const {...} //overrides Base::Clone
};

Однако следующий трюк не будет работать:

struct Base
{
   virtual shared_ptr<Base> Clone() const { ... }
   virtual ~Base(){}
};

struct Derived : Base
{
   virtual shared_ptr<Derived> Clone() const {...} //hides Base::Clone
};

В этом примере Derived :: Clone скрывает Base: : Clone , а не переопределяет его, потому что стандарт говорит, что тип возвращаемого значения замещающего элемента может изменяться только от ссылки (или указателя) к основанию для ссылки (или указателя) на производный. Есть ли какое-нибудь умное решение для этого? Конечно, можно возразить, что функция Clone в любом случае должна возвращать простой указатель, но пока забудем об этом - это просто иллюстративный пример. Я ищу способ включить изменение типа возврата виртуальной функции с интеллектуального указателя на Base на интеллектуальный указатель на Derived .

Заранее спасибо!

Обновление: Мой второй пример действительно не компилируется, благодаря Iammilind

32
задан Armen Tsirunyan 2 December 2014 в 15:49
поделиться