La question est à l'envers.
Vous ne cherchez pas de raison de rendre une fonction non publique. C'est un état d'esprit incorrect pour commencer (à mon avis). Le raisonnement devrait aller dans l'autre sens.
En d'autres termes - ne demandez pas "pourquoi devrais-je le rendre privé?". Demandez: "pourquoi devrais-je le rendre public?"
En cas de doute, ne l'exposez pas. C'est un peu comme le rasoir d'Ockham - ne multipliez pas les droits au-delà de la nécessité.
EDIT: Aborder les contre-arguments soulevés par @Telastyn dans les commentaires (pour éviter une discussion approfondie là-bas):
J'ai entendu cela au fil du temps et je l'ai même embrassé pendant un certain temps, mais d'après mon expérience, les choses ont tendance à être trop privées.
Oui, c'est parfois un problème si une classe est ouverte à l'héritage, mais vous ne pouvez pas remplacer certaines méthodes privées (dont vous souhaitez modifier le comportement).
Mais protected
cela suffirait - et ce n'est toujours pas public.
Cela conduit à beaucoup de duplication de code et de surcharge pour arriver à "des choses qui ne devraient pas être publiques" mais qui sont de toute façon accessibles indirectement.
Si cela devient problématique, rendez-le simplement public! Il y a la nécessité dont je parlais :)
Mon point est que vous ne devriez pas le faire au cas où (YAGNI et tout).
Notez qu'il est toujours plus facile de rendre publique une fonction privée que de la ramener à la confidentialité. Ce dernier est susceptible de casser le code existant.