В С++ мы можем это сделать:
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