MediumООП

Что такое method hiding и как его избежать?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

Если в производном классе объявить метод с тем же именем, что в базе, но другой сигнатурой — он скрывает все методы базы с этим именем (независимо от сигнатуры). Это hiding, не overriding.

struct Base {
    void f(int);
    void f(double);
};
struct Derived : Base {
    void f(int);   // скрывает ОБА Base::f!
};
Derived d;
// d.f(3.14);   // ошибка: Base::f(double) скрыт

// РЕШЕНИЕ: using Base::f;
struct Derived2 : Base {
    using Base::f;          // открыть все перегрузки базы
    void f(int);
};
  • Overriding — только для virtual с одинаковой сигнатурой;
  • using Base::f; открывает все перегрузки; явно — d.Base::f(3.14);
  • override помогает: если сигнатура чуть отличается — компилятор скажет.

Частая ошибка при «переопределении» только одной перегрузки.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.