HardООП
Что такое covariant return type?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
Covariant return type — при override virtual функции можно вернуть тип, производный от возвращаемого базой. Единственное разрешённое изменение сигнатуры при override. Работает для указателей и ссылок, не для значений.
class Base {
public:
virtual Base* clone() const = 0; // возвращает Base*
virtual ~Base() = default;
};
class Derived : public Base {
public:
Derived* clone() const override { // OK: Derived* ковариантен Base*
return new Derived(*this);
}
};
Derived d;
Derived* d2 = d.clone(); // напрямую, без каста- Применяется в
clone(), factory-методах, builder-паттернах; - Без covariant пришлось бы возвращать
Base*и кастовать; - Нельзя ковариантно менять тип параметра — override требует точно такой же сигнатуры.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.