В 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