Cuando una clase base se deriva de una clase derivada con la ayuda de heritage , la accesibilidad de la clase base por parte de la clase derivada se controla mediante modos de visibilidad. La clase derivada no hereda el acceso a miembros de datos privados. Sin embargo, hereda un objeto principal completo, que contiene los miembros privados que declara esa clase.
CPP
// C++ implementation to show // Visibility modes #include <bits/stdc++.h> using namespace std; // Base class // Class A will be inherited class A { public: int x; protected: int y; private: int z; }; // Derived class // Class B will inherit Class A class B : public A { }; // main function int main() { B b; // x is public // so its value will be printed cout << b.x << endl; // y is protected // so it will give visibility error cout << b.y << endl; // z is not accessible from B // so it will give visibility error cout << b.z << endl; };
Errores de compilación:
prog.cpp: In function 'int main()': prog.cpp:14:6: error: 'int A::y' is protected int y; ^ prog.cpp:34:12: error: within this context cout << b.y << endl; ^ prog.cpp:17:6: error: 'int A::z' is private int z; ^ prog.cpp:37:12: error: within this context cout << b.z << endl; ^
¿Qué significa visibilidad en este programa?
- Dado que el miembro ‘x’ en A es público , su visibilidad estará abierta a todos. Significa que cualquier clase puede acceder y usar esta x. Esa es la razón por la que no hay error en ‘b.x’.
- El miembro ‘y’ en A está protegido , su visibilidad será solo para la clase derivada. Significa que cualquier clase derivada puede acceder y usar esta y.
- El miembro ‘z’ en A es privado , su visibilidad no estará abierta a ninguna otra clase. Significa que cualquier clase derivada no puede acceder y usar este z.
Tipos de modos de visibilidad:
Hay tres tipos de modos de visibilidad:
- Modo de visibilidad pública: si derivamos una subclase de una clase base pública. Luego, el miembro público de la clase base pasará a ser público en la clase derivada y los miembros protegidos de la clase base pasarán a estar protegidos en la clase derivada.
CPP
// C++ implementation to show // Public Visibility mode #include <bits/stdc++.h> using namespace std; // Base class // Class A will be inherited class A { public: int x; protected: int y; private: int z; }; // Derived class // Class B will inherit Class A // using Public Visibility mode class B : public A { }; // main function int main() { B b; // x is public and it will remain public // so its value will be printed cout << b.x << endl; // y is protected and it will remain protected // so it will give visibility error cout << b.y << endl; // z is not accessible from B as // z is private and it will remain private // so it will give visibility error cout << b.z << endl; };
- Errores de compilación:
prog.cpp: In function 'int main()': prog.cpp:14:9: error: 'int A::y' is protected int y; ^ prog.cpp:37:15: error: within this context cout << b.y << endl; ^ prog.cpp:17:9: error: 'int A::z' is private int z; ^ prog.cpp:42:15: error: within this context cout << b.z << endl; ^
- Modo de visibilidad protegida: si derivamos una subclase de una clase base protegida. Entonces, tanto el miembro público como los miembros protegidos de la clase base quedarán protegidos en la clase derivada.
CPP
// C++ implementation to show // Protected Visibility mode #include <bits/stdc++.h> using namespace std; // Base class // Class A will be inherited class A { public: int x; protected: int y; private: int z; }; // Derived class // Class B will inherit Class A // using Protected Visibility mode class B : protected A { }; // main function int main() { B b; // x is public and it will become protected // so it will give visibility error cout << b.x << endl; // y is protected and it will remain protected // so it will give visibility error cout << b.y << endl; // z is not accessible from B as // z is private and it will remain private // so it will give visibility error cout << b.z << endl; };
- Errores de compilación:
prog.cpp: In function 'int main()': prog.cpp:11:9: error: 'int A::x' is inaccessible int x; ^ prog.cpp:33:15: error: within this context cout << b.x << endl; ^ prog.cpp:14:9: error: 'int A::y' is protected int y; ^ prog.cpp:37:15: error: within this context cout << b.y << endl; ^ prog.cpp:17:9: error: 'int A::z' is private int z; ^ prog.cpp:42:15: error: within this context cout << b.z << endl; ^
- Modo de visibilidad privada: si derivamos una subclase de una clase base privada. Entonces, tanto el miembro público como los miembros protegidos de la clase base se convertirán en privados en la clase derivada.
CPP
// C++ implementation to show // Private Visibility mode #include <bits/stdc++.h> using namespace std; // Base class // Class A will be inherited class A { public: int x; protected: int y; private: int z; }; // Derived class // Class B will inherit Class A // using Private Visibility mode class B : private A { }; // main function int main() { B b; // x is public and it will become private // so it will give visibility error cout << b.x << endl; // y is protected and it will become private // so it will give visibility error cout << b.y << endl; // z is not accessible from B as // z is private and it will remain private // so it will give visibility error cout << b.z << endl; };
- Errores de compilación:
prog.cpp: In function 'int main()': prog.cpp:11:9: error: 'int A::x' is inaccessible int x; ^ prog.cpp:33:15: error: within this context cout << b.x << endl; ^ prog.cpp:14:9: error: 'int A::y' is protected int y; ^ prog.cpp:37:15: error: within this context cout << b.y << endl; ^ prog.cpp:17:9: error: 'int A::z' is private int z; ^ prog.cpp:42:15: error: within this context cout << b.z << endl; ^
¿Cómo cambiar el modo de visibilidad después de la herencia?
Después de heredar una clase base con la ayuda de un modo de visibilidad específico, los miembros cambiarán automáticamente su visibilidad como se mencionó anteriormente. Pero para cambiar la visibilidad después de esta herencia, debemos hacerlo manualmente.
Sintaxis:
<visibility_mode>: using base::<member>;
Por ejemplo:
// inorder to change the visibility of x to public <public>: using base::<x>;
Ejemplo: Considere una clase base que contiene un miembro público ‘a’, miembros protegidos ‘b’ y ‘c’ y miembros privados ‘d’ y ‘e’. El siguiente programa explica cómo cambiar la visibilidad de ‘b’ de protegida a pública.
CPP
// C++ implementation to show how to // change the Visibility modes #include <bits/stdc++.h> using namespace std; // Base class // Class A will be inherited class BaseClass { // Public members public: int a; // Protected members protected: int b; int c; // Private members private: int d; int e; }; // BaseClass will be inherited as private // to change all the members to private first class DerivedClass : private BaseClass { // Now change the visibility of b // from private to public public: using BaseClass::b; }; // main function int main() { DerivedClass derivedClass; // d must be private and // hence generate visibility error cout << derivedClass.d << endl; // b must be now public and hence should // not generate visibility error cout << derivedClass.b << endl; return 0; };
Errores de compilación:
prog.cpp: In function 'int main()': prog.cpp:22:9: error: 'int BaseClass::d' is private int d; ^ prog.cpp:47:26: error: within this context cout << derivedClass.d << endl; ^
Publicación traducida automáticamente
Artículo escrito por AnshulVaidya y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA