«Сокрытие» - это сокращение от того, что действительно происходит.Правило простое (): при поиске имени компилятор запускается в текущей области видимости;если он найдет это имя, он готов.Если он не находит его, он перемещается в следующую объемную область.Повторяйте, пока не закончите.
Соедините это с правилом, что перегрузка происходит только среди функций, определенных в той же области действия .Как только компилятор находит это имя, все определения в одной и той же области участвуют в перегрузке.Компилятор не смотрит во внешние области, чтобы найти вещи, которые могут соответствовать названию.В этом и заключается безумие.
Обратите внимание, что поиск имени ищет только имя;это не зависит от того, переопределяет ли найденное имя имя в базовом классе, а также от того, существует ли в текущей области более одной функции с одинаковым именем (т. е. имя перегружено).Как только имя найдено, поиск заканчивается.Все определения с таким именем в этой области участвуют в перегрузке.
Итак, void visit(B&)
в visitor3
скрывает все остальные определения из visit
ввсе базовые классы.Имя определено в visitor3
, поэтому компилятор больше нигде не выглядит.