virtuales metodo funciones destructores clase abstracta c++ class inheritance struct information-hiding

c++ - funciones - metodo virtual c#



Entonces, ¿ahora struct puede tener una función virtual y soporte de herencia? ¿Qué diferencia con las clases entonces? ¿Cuál es el verdadero propósito de ocultar información? (1)

Posible duplicado:
¿Cuáles son las diferencias entre struct y clase en C ++?

http://www.cplusplus.com/reference/std/typeinfo/type_info/

Supongo que mi "profesor" no me dijo mucho sobre las diferencias entre estructura y clases en C ++.

Leí en otra pregunta que sobre la herencia, struct es pública por defecto ... También creo que struct no tiene constructores / destructores ...

¿Cuáles son las otras diferencias entonces? ¿Importan tanto?

Y al hablar sobre atributos / métodos privados / protegidos, no son accesibles en tiempo de ejecución, solo porque el compilador lo dice en tiempo de compilación e informa un error, ¿no? Luego, comparando esas características con las clases, ¿qué aporta realmente el "ocultamiento de la información" al programador? ¿Está aquí para que cuando alguien reutilice la clase, esta persona no haga un mal uso de la clase porque el compilador informará de las cosas privadas / protegidas?

Todavía lucho con el verdadero propósito de ocultar información, todavía quiero sonar en mi cabeza como si aportara más seguridad en los programas, lo que significa menos brechas de seguridad, pero estoy realmente confundido sobre el objetivo de dicho diseño en el lenguaje ... (Y no tengo la intención de estar en contra de C ++ de ninguna manera, solo para entender en qué casos esta característica puede ser interesante o no, de lo contrario, eso no es un problema, pero me gustaría saber ...).


En lo que respecta al compilador, no hay diferencia entre la struct y la class no sea la accesibilidad predeterminada. Son solo dos palabras clave diferentes para definir lo mismo. Entonces, las estructuras pueden tener constructores, destructores, clases base, funciones virtuales, todo.

En lo que respecta a los programadores, es una convención común usar struct para las clases sin ninguna de esas cosas (específicamente, POD ), o ir más allá y usar struct solo para las clases sin funciones de miembro definidas por el usuario, solo miembros de datos públicos. La gente a veces arruina esta convención, porque es sorprendentemente fácil pensar que una clase es POD cuando no lo es, pero al menos lo intentan.

En C ++, al menos, ocultar información no tiene absolutamente nada que ver con la seguridad. Olvida ese derecho de tu mente. No proporciona ningún tipo de seguridad, excepto de la misma manera general en que cualquier buena práctica de codificación brinda un código más fácil de razonar y, por lo tanto, los programadores cometen menos errores.

El objetivo del ocultamiento de información es permitirle cambiar la implementación más tarde, tal vez para eliminar o renombrar miembros privados, con la seguridad de que ninguno de los usuarios de su clase, fuera de la clase en sí y sus amigos, se está refiriendo a ellos. Obviamente, es útil hacer exactamente eso, pero de forma menos obvia y quizás más importante, es útil porque hace explícito en el código cuál es la interfaz de su clase, que desea que los clientes utilicen, y que los usuarios de su clase pueden esperar trabajar. En principio, puede lograr lo mismo con la documentación, pero en la práctica es bueno para el compilador aplicar las reglas.

No es "seguro" porque en cualquier compilador es posible evitar la protección pública / privada. Pero si los usuarios de tu clase hacen eso, están usando algún truco grotesco, merecen que su código deje de compilar / trabajar cuando cambies tu clase, y si vienen a quejarte, te puedes reír de ellos.