Modos de visibilidad en C++ con ejemplos

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: 
 

  1. 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;
};
  1. 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;
               ^
  1.  
  2. 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;
};
  1. 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;
               ^
  1.  
  2. 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;
};
  1. 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;
               ^
  1.  

¿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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *