La respuesta aceptada explica esto para las funciones privadas virtuales , pero eso solo responde a una faceta específica de la pregunta, que es considerablemente más limitada de lo que preguntó el OP. Entonces, necesitamos reformular: ¿Por qué estamos obligados a declarar funciones privadas no virtuales en los encabezados?
Otra respuesta invoca el hecho de que las clases deben declararse en un bloque, después de lo cual están selladas y no se pueden agregar. Eso es lo que estaría haciendo al omitir declarar un método privado en el encabezado y luego tratar de definirlo en otro lugar. Buen punto ¿Por qué algunos usuarios de la clase deberían poder aumentarlo de una manera que otros usuarios no puedan observar? Los métodos privados son parte de esto y no están excluidos de esto. Pero luego preguntas por qué están incluidos, y parece un poco tautológico. ¿Por qué los usuarios de clase deben saber sobre ellos? Si no fueran visibles, los usuarios no podrían agregar ninguno, y bueno, listo.
Entonces, quería proporcionar una respuesta que, en lugar de incluir métodos privados por defecto, proporcione puntos específicos a favor de que sean visibles para los usuarios. Se da una razón mecanicista para las funciones privadas no virtuales que requieren declaración pública en GotW # 100 de Herb Sutter sobre el lenguaje Pimpl como parte de su justificación. No hablaré sobre Pimpl aquí, ya que estoy seguro de que todos lo sabemos. Pero aquí está el bit relevante:
En C ++, cuando algo en una definición de clase de archivo de encabezado cambia, todos los usuarios de esa clase deben volver a compilarse, incluso si el único cambio fue a los miembros de la clase privada a los que los usuarios de la clase ni siquiera pueden acceder. Esto se debe a que el modelo de compilación de C ++ se basa en la inclusión textual, y porque C ++ supone que las personas que llaman conocen dos cosas principales sobre una clase que pueden ser afectadas por miembros privados:
- Tamaño y diseño : [de miembros y funciones virtuales: se explica por sí mismo y es excelente para el rendimiento, pero no por qué estamos aquí]
- Funciones : el código de llamada debe poder resolver las llamadas a las funciones miembro de la clase, incluidas las funciones privadas inaccesibles que se sobrecargan con funciones no privadas; si la función privada coincide mejor, el código de llamada no se compilará. (C ++ tomó la decisión deliberada de diseño de realizar una resolución de sobrecarga antes de verificar la accesibilidad por razones de seguridad. Por ejemplo, se consideró que cambiar la accesibilidad de una función de privado a público no debería cambiar el significado del código de llamada legal).
Sutter es, por supuesto, una fuente extremadamente confiable como miembro del Comité, por lo que conoce "una decisión de diseño deliberada" cuando la ve. Y la idea de exigir la declaración pública de métodos privados como una forma de evitar una semántica alterada o accesibilidad accidentalmente interrumpida más tarde es probablemente la razón más convincente. Afortunadamente, ¡ya que todo parecía inútil antes de ahora!