Ocultar información tiene la ventaja de que haces partes de código independiente de otras partes. Eso ayuda mucho a poder reutilizar algunas partes del código en otro programa y evita fallos inesperados cuando tocas una parte del código.
Por ejemplo, para acceder al campo nombre de una estructura persona, tienes que saber de qué tipo es.
Para acceder al atributo nombre de una clase, si está oculto y lo haces a través de un método, no necesitas saber el tipo, sólo necesitas saber el tipo del parámetro del método (que no tiene por qué coincidir con el del atributo).
Si en un momento dado decides cambiar nombre del tipo que tenga por otro tipo, en el primer caso tendrías que tocar el código por todos lados. En el segundo sólo dentro de la clase (se supone que el tipo del parámetro del método de acceso no lo cambias y eres capza de convertir de uno en otro).
Otra característica muy potente es el polimorfismo. Puedes hacer que varias clases distintas hereden de una clase comun. Luego puedes hacer, por ejemplo, arrays de punteros a esa clase comun y en cada elemento puedes meter cualquiera de las clases hijas. Por ejemplo, imaginate que haces una clase objeto_grafico con un método dibujate(). Luego heredas y haces triangulo, rectangulo, marciano, etc. El trozo de código que tiene que coger todos esos chismes y dibujarlos, no necesita saber qué son, le basta con saber que son objetos_graficos. Es mas, en un futuro puedes crear nuevos objetos graficos y tu código sigue valiendo (si lo tienes compilado en una librería aparte, ni siquiera necestias recompilarlo).
Se bueno.