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 подскажет развёрнутый ответ в реальном времени.