@DeadMG, да. Я не сразу запомнил эти функции, но что-то похожее на них. Что касается исключения, хорошо, просто была идея о том, как обрабатывать различия в типах через промежуточный этап.

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

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

Ответы на вопрос(4)

Ваш ответ на вопрос