Обычная идиома клона использует ковариантные типы возвращаемых данных:
struct Base {
virtual Base* clone();
};
struct Derived : public Base {
Derived* clone();
};
Я читал о том, что ковариантные типы возвращаемых данных были более поздним дополнением к C ++, и более старые компиляторы могут их не поддерживать.В этом случае класс Derived
должен объявить свою функцию-член clone
для возврата Base*
.Поскольку, по-видимому, я использую Derived
объекты только через Base
указатели и / или ссылки при использовании этой идиомы, какова реальная польза / преимущество объявления типа возврата Derived*
?
Также, связанный вопрос:
Я бы предпочел использовать умные указатели для выражения семантики передачи права собственности для подписи clone
.Это невозможно при использовании ковариантных типов возврата, так как auto_ptr<Derived>
не является ковариантным с auto_ptr<Base>
.(Обратите внимание, что я не ищу лекцию об использовании умных указателей - auto_ptr
просто используется в качестве примера здесь).Так в этом случае, есть ли причина не иметь Derived
return auto_ptr<Base>
?Есть ли лучший способ выразить семантику передачи права собственности?