@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