В 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