Спецификаторы доступа являются конструкцией времени компиляции, и поэтому компилятор обнаруживает любое нарушение правил доступа во время компиляции (очевидно) на основе типа статического объекта (или указателя).Такое нарушение не может быть обнаружено во время выполнения.
Так что bptr->f()
работает, потому что компилятор видит, что статический тип bptr
равен B
с функцией public
f()
определено, поэтому выражение bptr->f()
проходит тест компилятора.Следовательно, это работает.
Но dptr->f()
не работает, поскольку статический тип dptr
равен D
, который имеет закрытую функцию f()
, поэтому код не будетдаже не компилировать!
Теперь, нарушает ли это инкапсуляцию или нет, это очень субъективный вопрос и получит субъективные ответы.Это полностью зависит от того, как его определить, и от него напрямую вытекают аргументы.Не существует единого универсального определения.Мое личное мнение таково: если язык позволяет это, то (это подразумевало бы), согласно сообществу C ++, это не нарушает инкапсуляцию, или, если это так, то C ++ позволяет это достигать чего-то очень благородного (что в противном случаене возможно).В противном случае, я бы сказал, что это просто еще одна ошибка C ++, такая как:
Аргумент по умолчанию в середине списка параметров?