C++ позволяет изменять уровень доступа к членам в производном классе в любую сторону, Java — только в сторону повышения уровня доступа, а C# — не позволяет вообще.
Понятно, что этим Java обеспечивает возможность рассматривать любой объект производного класса как объект базового класса, C++ — свободу программиста, а вот почему C# не позволяет изменять уровень доступа в сторону повышения, мне не ясно.
Кроме того было бы интересно узнать, как осмысленно можно применить понижение (в C++) и повышение (в C++ и Java) уровня доступа?