poo ejemplo codigo clases c++ class mfc

ejemplo - codigo de clases en c++



Miembros privados y protegidos: C++ (16)

¿Puede alguien aclararme la diferencia entre miembros private y protected en las clases?

Entiendo por las convenciones de mejores prácticas que las variables y funciones que no se llaman fuera de la clase deben hacerse private , pero mirando a mi proyecto MFC , MFC parece favorecer la protected .

¿Cuál es la diferencia y cuál debo usar?


Claro, eche un vistazo a la pregunta sobre las variables de miembros protegidos . Se recomienda usar privado como predeterminado (al igual que las sesiones de class C ++) para reducir el acoplamiento. Las variables de miembro protegido son siempre una mala idea, las funciones de miembro protegido se pueden usar para, por ejemplo, el patrón de Método de plantilla.


Dado que no se necesita una función de miembro público para recuperar 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 es consciente de lo que está haciendo.


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 los métodos que no son visibles para el uso general de la clase.


Los atributos y métodos marcados como protected son, a diferencia de los privados, todavía visibles en las subclases.

A menos que no desee utilizar o proporcionar la posibilidad de anular el método en posibles subclases, las haría private .


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.

Edición: Ambos también son accesibles a los amigos de su clase, y en el caso de miembros protegidos, a los amigos de sus clases derivadas.

Edición 2: Use lo que tenga sentido en el contexto de su problema. Debe intentar 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, utilice miembros protegidos. Consulte las Preguntas frecuentes de C ++ para comprender mejor el problema. Esta pregunta sobre las variables protegidas también podría ayudar.


Los miembros protegidos solo pueden ser accedidos por los descendientes de la clase y por el código en el mismo módulo. Solo se puede acceder a los miembros privados por la clase en la que están declarados y por el código en el mismo módulo.

Por supuesto, las funciones de los amigos tiran esto por la ventana, pero bueno.


Los miembros y amigos de cualquier clase derivada de esa clase base pueden acceder a un miembro de clase base no estático protegido mediante uno de los siguientes:

  • Un puntero a una clase derivada directa o indirectamente
  • Una referencia a una clase derivada directa o indirectamente
  • Un objeto de una clase derivada directa o indirectamente.

Los modificadores de acceso privados y protegidos son los mismos, 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 '''' ''''


Se puede acceder a los miembros protegidos desde clases derivadas. Los privados no pueden.

class Base { private: int MyPrivateInt; protected: int MyProtectedInt; public: int MyPublicInt; } class Derived : Base { public: int foo1() { return MyPrivateInt;} // Won''t compile! int foo2() { return MyProtectedInt;} // OK int foo3() { return MyPublicInt;} // OK }; class Unrelated { private: Base B; public: int foo1() { return B.MyPrivateInt;} // Won''t compile! int foo2() { return B.MyProtectedInt;} // Won''t compile int foo3() { return B.MyPublicInt;} // OK };

En términos de "mejores prácticas", depende. Si existe una pequeña posibilidad de que alguien quiera derivar una nueva clase de la existente y necesite acceso a miembros internos, protéjalos, no Privados. Si son privados, su clase puede volverse difícil de heredar fácilmente.


Se puede acceder al miembro privado solo en la misma clase en la que ha declarado, y como miembro protegido se puede acceder en la clase donde se declara junto con las clases que hereda.


Todo depende de lo que quiera hacer y de lo que quiera que las clases derivadas puedan ver.

class A { private: int _privInt = 0; int privFunc(){return 0;} virtual int privVirtFunc(){return 0;} protected: int _protInt = 0; int protFunc(){return 0;} public: int _publInt = 0; int publFunc() { return privVirtFunc(); } }; class B : public A { private: virtual int privVirtFunc(){return 1;} public: void func() { _privInt = 1; // wont work _protInt = 1; // will work _publInt = 1; // will work privFunc(); // wont work privVirtFunc(); // wont work protFunc(); // will work publFunc(); // will return 1 since it''s overridden in this class } }


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 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.


private es preferido para datos de miembros. Los miembros de las clases de C ++ son private por defecto.

Se prefiere el public 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 usarlos mal.

private no es accesible en absoluto. Nadie puede usarlos fuera de la clase, y nadie puede usarlos mal. Ni siquiera en las clases derivadas.

protected es un compromiso porque puede usarse en clases derivadas. Cuando se deriva de una clase, tiene un buen entendimiento de la clase base y tiene cuidado de no abusar de estos miembros.

MFC es un contenedor de C ++ para la API de Windows, prefiere el public y está protected . Las clases generadas por el asistente de Visual Studio tienen una mezcla fea de miembros protected , public y private . Pero hay algo de lógica en las clases de MFC.

Los miembros como SetWindowText son public 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 están protected . Aún puede acceder a ellos en la clase derivada para anular estas funciones.

Algunos miembros tienen que hacer subprocesos y bucles de mensajes, no se debe acceder o anular, por lo que se declaran como private

En las estructuras de C ++, los miembros son public por defecto. Las estructuras se usan generalmente solo para datos, no para métodos, por lo tanto, public declaración public se considera segura.


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 se puede acceder 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 buena razón para otorgar acceso gratuito a las clases internas de sus clases derivadas, entonces puede protegerlas.


privado = accesible solo por la nave nodriza (clase base) (es decir, solo mis padres pueden ir al dormitorio de mis padres)

protegido = accesible por la nave nodriza (clase base), y sus hijas (es decir, solo mis padres pueden ir a la habitación de mis padres, pero le dieron permiso al hijo / a para entrar a la habitación de los padres)

público = accesible por la 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)


  • 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 son accesibles fuera de la clase. Podemos declarar a nuestros miembros de datos como privados para que nadie pueda hacer cambios directos a nuestras variables de miembros y podemos proporcionar captadores y definidores públicos para cambiar nuestros miembros privados. Y este concepto siempre se aplica en la regla de negocio.

  • Protegido : También es un especificador de acceso. En C ++, los miembros protegidos son accesibles dentro de la clase y a la clase heredada pero no fuera de la clase. En Java, los miembros protegidos son accesibles dentro de la clase, a la clase heredada, así como a todas las clases dentro del mismo paquete.