Los miembros privados solo son accesibles dentro de la clase que los define.
Los miembros protegidos son accesibles en la clase que los define y en las clases que heredan de esa clase.
Editar: Ambos también son accesibles por amigos de su clase, y en el caso de miembros protegidos, por amigos de sus clases derivadas.
Edición 2: use lo que tenga sentido en el contexto de su problema. Debe intentar hacer que los miembros sean privados siempre que pueda para reducir el acoplamiento y proteger la implementación de la clase base, pero si eso no es posible, use miembros protegidos. Consulte las preguntas frecuentes de C ++ para comprender mejor el problema. Esta pregunta sobre variables protegidas también podría ayudar.
Los miembros públicos de una clase A son accesibles para todos y para todos.
Los miembros protegidos de una clase A no son accesibles fuera del código de A, pero son accesibles desde el código de cualquier clase derivada de A.
Los miembros privados de una clase A no son accesibles fuera del código de A, o del código de cualquier clase derivada de A.
Entonces, al final, elegir entre protegido o privado es responder las siguientes preguntas: ¿Cuánta confianza está dispuesto a depositar en el programador de la clase derivada?
De forma predeterminada , suponga que la clase derivada no es de confianza y haga que sus miembros sean privados . Si tiene una muy buena razón para dar acceso libre de los componentes internos de la clase madre a sus clases derivadas, puede protegerlos.
fuente
the protected data of the base class is part of the data of the derived class.
De hecho. ¿No es mejor, entonces, que el escritor de la clase derivada declare esos datos en su clase, en lugar de los míos? ... :-) ...The writer of the derived class is expected to handle this data properly or it is a bug.
En el patrón NVI, el objetivo es hacer que todo sea privado, incluyendo métodos, para limitar el daño que el escritor de clase derivado podría hacer a la jerarquía. Los métodos protegidos ya son un problema potencial. No estoy convencido de que agravar esto usando el estado protegido sea el enfoque correcto.Se puede acceder a los miembros protegidos desde clases derivadas. Los privados no pueden.
En términos de "mejores prácticas", depende. Si incluso existe una leve posibilidad de que alguien desee obtener una nueva clase de la existente y necesite acceso a miembros internos, hágalos protegidos, no privados. Si son privados, tu clase puede ser difícil de heredar fácilmente.
fuente
La razón por la que MFC favorece la protección es porque es un marco. Probablemente desee subclasificar las clases MFC y, en ese caso, se necesita una interfaz protegida para acceder a métodos que no son visibles para el uso general de la clase.
fuente
Todo depende de lo que quieras hacer y de lo que quieras que las clases derivadas puedan ver.
fuente
Los atributos y métodos marcados como
protected
son, a diferencia de los privados, aún visibles en las subclases.A menos que no desee usar o proporcionar la posibilidad de anular el método en posibles subclases, los haría
private
.fuente
Claro, eche un vistazo a la pregunta de Variables de miembros protegidos . Se recomienda utilizar privado como predeterminado (al igual que C ++
class
ses do) para reducir el acoplamiento. Las variables miembro protegidas son siempre una mala idea, las funciones miembro protegidas se pueden utilizar, por ejemplo, para el patrón Método de plantilla.fuente
Solo los descendientes de la clase pueden acceder a los miembros protegidos y mediante el código del mismo módulo. Solo se puede acceder a los miembros privados por la clase en la que se declaran y por código en el mismo módulo.
Por supuesto, las funciones de amigo arrojan esto por la ventana, pero bueno.
fuente
los miembros privados solo son accesibles desde la clase, los miembros protegidos son accesibles en la clase y las clases derivadas. Es una característica de la herencia en los idiomas OO.
Puede tener herencia privada, protegida y pública en C ++, que determinará a qué clases derivadas puede acceder en la jerarquía de herencia. C #, por ejemplo, solo tiene herencia pública.
fuente
privado = accesible solo por la nave nodriza (clase base) (es decir, solo mis padres pueden ir a la habitación de mis padres)
protegido = accesible por nave nodriza (clase base) y sus hijas (es decir, solo mis padres pueden ir a la habitación de mis padres, pero dieron permiso a su hijo / hija para entrar a la habitación de los padres)
público = accesible por nave nodriza (clase base), hija y todos los demás (es decir, solo mis padres pueden ir a la habitación de mis padres, pero es una fiesta en casa - mi casa su casa)
fuente
Dado que no se necesita ninguna función de miembro público para buscar y actualizar miembros protegidos en la clase derivada, esto aumenta la eficiencia del código y reduce la cantidad de código que necesitamos escribir. Sin embargo, se supone que el programador de la clase derivada debe estar al tanto de lo que está haciendo.
fuente
private
se prefiere para los datos del miembro. Los miembros en las clases de C ++ sonprivate
por defecto.public
es preferido para las funciones de los miembros, aunque es una cuestión de opinión. Al menos algunos métodos deben ser accesibles.public
Es accesible para todos. Es la opción más flexible y menos segura. Cualquiera puede usarlos y cualquiera puede abusar de ellos.private
no es accesible en absoluto. Nadie puede usarlos fuera de la clase, y nadie puede usarlos mal. Ni siquiera en clases derivadas.protected
es un compromiso porque puede usarse en clases derivadas. Cuando deriva de una clase, comprende bien la clase base y tiene cuidado de no hacer un mal uso de estos miembros.MFC es un contenedor de C ++ para la API de Windows, prefiere
public
yprotected
. Clases generadas por Visual Studio Asistente tienen una mezcla de feaprotected
,public
yprivate
miembros. Pero hay algo de lógica en las clases de MFC.Miembros como
SetWindowText
sonpublic
porque a menudo necesita acceder a estos miembros.Los miembros como
OnLButtonDown
, manejan las notificaciones recibidas por la ventana. No deben ser accedidos, por lo tanto sonprotected
. Todavía puede acceder a ellos en la clase derivada para anular estas funciones.Algunos miembros tienen que hacer hilos y bucles de mensajes, no se debe acceder a ellos ni anularlos, por lo que se declaran como
private
En estructuras C ++, los miembros son
public
por defecto. Las estructuras generalmente se usan solo para datos, no para métodos, por lo tanto, lapublic
declaración se considera segura.fuente
private
por defecto en Visual Studio. También estáprivate
por defecto en gcc, nunca estápublic
por defecto. A menos que me vuelva a equivocar. No puedo encontrar el estándar al que te refieres.Solo se puede acceder al miembro privado en la misma clase donde ha declarado donde se puede acceder como miembro protegido en la clase donde se declara junto con las clases que hereda.
fuente
Privado : es un especificador de acceso. Por defecto, las variables de instancia (miembro) o los métodos de una clase en c ++ / java son privados. Durante la herencia, el código y los datos siempre se heredan pero no es accesible fuera de la clase. Podemos declarar a nuestros miembros de datos como privados para que nadie pueda hacer cambios directos a nuestras variables de miembro y podemos proporcionar captadores y establecedores públicos para cambiar nuestros miembros privados. Y este concepto siempre se aplica en la regla de negocios.
Protegido : también es un especificador de acceso. En C ++, los miembros protegidos son accesibles dentro de la clase y para la clase heredada pero no fuera de la clase. En Java, los miembros protegidos son accesibles dentro de la clase, tanto para la clase heredada como para todas las clases dentro del mismo paquete.
fuente
Los miembros y amigos de cualquier clase derivada de esa clase base pueden acceder a un miembro de clase base no estático protegido utilizando uno de los siguientes:
fuente
Privado: Accesible por funciones de miembro de clase y función de amigo o clase de amigo. Para la clase C ++, este es el especificador de acceso predeterminado.
Protegido: Accesible por funciones de miembro de clase, función de amigo o clase de amigo y clases derivadas.
Consulte este enlace para más detalles.
fuente
Los modificadores de acceso privado y protegido son uno y el mismo solo que se puede acceder a los miembros protegidos de la clase base fuera del alcance de la clase base en la clase secundaria (derivada). También se aplica lo mismo a la herencia. Pero con el modificador privado solo se puede acceder a los miembros de la clase base en el ámbito o código de la clase base y sus funciones de amigo solo '' ''
fuente