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