Скрытие унаследованных виртуалов - это не то, что должно быть сделано как часть преднамеренного дизайна.Языки поддерживают виртуальное сокрытие, чтобы сделать инфраструктуру объектов более устойчивой к будущим изменениям.
Пример: Релиз 1 структуры объектов X не предоставляет функцию Print ().Боб решает расширить несколько объектов платформы X, определив функции Print () в своих собственных классах-потомках.Так как он планирует переопределить их в более специфических классах, он также делает функцию Print () виртуальной.
Позже, Выпуск 2 объектной структуры X выпущен.Боб решает обновить свой текущий проект, чтобы использовать Выпуск 2 вместо Выпуска 1. Без ведома Боба команда объектной инфраструктуры X также решила, что Print () будет полезной функцией, и поэтому они добавили виртуальный Print () в один избазовые классы фреймворка.
При виртуальном скрытии классы-потомки Боба, содержащие реализацию Print () Боба, должны компилироваться и нормально работать, даже если теперь в базовых классах существует другой Print () - даже с другой сигнатурой метода.Код, который знает о базовом классе Print (), продолжит его использовать, а код, который знает о Bob's Print (), продолжит его использовать.Никогда эти два не встретятся.
Без виртуального сокрытия код Боба не будет компилироваться вообще, пока он не выполнит некоторую нетривиальную операцию со своим исходным кодом, чтобы устранить конфликт имен в Print ().Некоторые утверждают, что это «правильная» вещь (отказ от компиляции), но реально любая ревизия базовой библиотеки, которая требует пересмотра существующего рабочего кода, не будет удовлетворена потребителями.Они будут обвинять фреймворк в том, что он сломал все, и плохо о нем говорят.
Было бы разумно, чтобы Боб получил предупреждение компилятора о том, что базовая печать скрыта печатью Боба, но это не фатальная ошибка.Это то, что Боб, вероятно, должен очистить (переименовав или удалив свою функцию Print ()) как можно скорее, чтобы избежать путаницы.