Тут уже хорошо ответили, но уточню: разница в зонах видимости/доступности, и это очень зависит от языка. Private — это локальная зона видимости (например, ограниченная юнитом, файлом, модулем, неймспейсом — для разных языков) то есть доступно из кода, составляющего одно логическое целое с этим классом. А Protected — это наоборот, видимость из всех порожденных от него классов, в каких бы файлах, модулях и юнитах они не находились.