Herencia en C++: public, protected y private explicados
Herencia public, protected y private en C++
En este tutorial, aprenderemos a usar herencia public, protected y private en C++ con la ayuda de ejemplos.
En la herencia de C++, podemos derivar una clase hija de la clase base en diferentes modos de acceso. Por ejemplo,
class Base {
.... ... ....
};
class Derivada : public Base {
.... ... ....
};
Observe la palabra clave public en el código
class Derivada : public Base
Esto significa que hemos creado una clase derivada de la clase base en modo público. Alternativamente, también podemos derivar clases en modos protegido o privado.
Estas 3 palabras clave (public, protected y private) se conocen como especificadores de acceso en la herencia de C++.
Herencia public, protected y private en C++
public, protected y private herencia tienen las siguientes características:
- herencia public hace que los miembros
publicde la clase base seanpublicen la clase derivada, y los miembrosprotectedde la clase base permanezcanprotecteden la clase derivada. - herencia protected hace que los miembros
publicyprotectedde la clase base seanprotecteden la clase derivada. - herencia private hace que los miembros
publicyprotectedde la clase base seanprivateen la clase derivada.
private de la clase base son inaccesibles para la clase derivada.class Base {
public:
int x;
protected:
int y;
private:
int z;
};
class DerivadaPublica: public Base {
// x es public
// y es protected
// z no es accesible desde DerivadaPublica
};
class DerivadaProtegida: protected Base {
// x es protected
// y es protected
// z no es accesible desde DerivadaProtegida
};
class DerivadaPrivada: private Base {
// x es private
// y es private
// z no es accesible desde DerivadaPrivada
}
Ejemplo 1: Herencia public en C++
// Programa en C++ para demostrar el funcionamiento de la herencia public
#include <iostream>
using namespace std;
class Base {
private:
int pvt = 1;
protected:
int prot = 2;
public:
int pub = 3;
// función para acceder a miembro privado
int getPVT() {
return pvt;
}
};
class DerivadaPublica : public Base {
public:
// función para acceder a miembro protegido desde Base
int getProt() {
return prot;
}
};
int main() {
DerivadaPublica objeto1;
cout << "Privado = " << objeto1.getPVT() << endl;
cout << "Protegido = " << objeto1.getProt() << endl;
cout << "Público = " << objeto1.pub << endl;
return 0;
}
Salida
Privado = 1 Protegido = 2 Público = 3
Aquí, hemos derivado DerivadaPublica de Base en modo público.
Como resultado, en DerivadaPublica:
- prot se hereda como protegido.
- pub y
getPVT()se heredan como públicos. - pvt es inaccesible ya que es privado en
Base.
Dado que los miembros privados y protegidos no son accesibles desde main(), necesitamos crear funciones públicas getPVT() y getProt() para acceder a ellos:
// Error: miembro "Base::pvt" es inaccesible
cout << "Privado = " << objeto1.pvt;
// Error: miembro "Base::prot" es inaccesible
cout << "Protegido = " << objeto1.prot;
Observe que la función getPVT() se ha definido dentro de Base. Pero la función getProt() se ha definido dentro de DerivadaPublica.
Esto es porque pvt, que es privado en Base, es inaccesible para DerivadaPublica.
Sin embargo, prot es accesible para DerivadaPublica debido a la herencia pública. Así que getProt() puede acceder a la variable protegida desde dentro de DerivadaPublica.
Accesibilidad en herencia public
| Accesibilidad | miembros privados | miembros protegidos | miembros públicos |
|---|---|---|---|
| Clase Base | Sí | Sí | Sí |
| Clase Derivada | No | Sí | Sí |
Ejemplo 2: Herencia protected en C++
// Programa en C++ para demostrar el funcionamiento de la herencia protected
#include <iostream>
using namespace std;
class Base {
private:
int pvt = 1;
protected:
int prot = 2;
public:
int pub = 3;
// función para acceder a miembro privado
int getPVT() {
return pvt;
}
};
class DerivadaProtegida : protected Base {
public:
// función para acceder a miembro protegido desde Base
int getProt() {
return prot;
}
// función para acceder a miembro público desde Base
int getPub() {
return pub;
}
};
int main() {
DerivadaProtegida objeto1;
cout << "Privado no puede ser accedido." << endl;
cout << "Protegido = " << objeto1.getProt() << endl;
cout << "Público = " << objeto1.getPub() << endl;
return 0;
}
Salida
Privado no puede ser accedido. Protegido = 2 Público = 3
Aquí, hemos derivado DerivadaProtegida de Base en modo protegido.
Como resultado, en DerivadaProtegida:
- prot, pub y
getPVT()se heredan como protegidos. pvtes inaccesible ya que es privado enBase.
Como sabemos, los miembros protegidos no pueden ser accedidos directamente desde fuera de la clase. Como resultado, no podemos usar getPVT() desde DerivadaProtegida.
Es por eso que también necesitamos crear la función getPub() en DerivadaProtegida para acceder a la variable pub.
// Error: miembro "Base::getPVT()" es inaccesible
cout << "Privado = " << objeto1.getPVT();
// Error: miembro "Base::pub" es inaccesible
cout << "Público = " << objeto1.pub;
Accesibilidad en herencia protected
| Accesibilidad | miembros privados | miembros protegidos | miembros públicos |
|---|---|---|---|
| Clase Base | Sí | Sí | Sí |
| Clase Derivada | No | Sí | Sí (heredados como variables protegidas) |
Ejemplo 3: Herencia private en C++
// Programa en C++ para demostrar el funcionamiento de la herencia private
#include <iostream>
using namespace std;
class Base {
private:
int pvt = 1;
protected:
int prot = 2;
public:
int pub = 3;
// función para acceder a miembro privado
int getPVT() {
return pvt;
}
};
class DerivadaPrivada : private Base {
public:
// función para acceder a miembro protegido desde Base
int getProt() {
return prot;
}
// función para acceder a miembro privado
int getPub() {
return pub;
}
};
int main() {
DerivadaPrivada objeto1;
cout << "Privado no puede ser accedido." << endl;
cout << "Protegido = " << objeto1.getProt() << endl;
cout << "Público = " << objeto1.getPub() << endl;
return 0;
}
Salida
Privado no puede ser accedido. Protegido = 2 Público = 3
Aquí, hemos derivado DerivadaPrivada de Base en modo privado.
Como resultado, en DerivadaPrivada:
- prot,
pubygetPVT()se heredan como privados. - pvt es inaccesible ya que es privado en
Base.
Como sabemos, los miembros privados no pueden ser accedidos directamente desde fuera de la clase. Como resultado, no podemos usar getPVT() desde DerivadaPrivada.
Es por eso que también necesitamos crear la función getPub() en DerivadaPrivada para acceder a la variable pub.
// Error: miembro "Base::getPVT()" es inaccesible
cout << "Privado = " << objeto1.getPVT();
// Error: miembro "Base::pub" es inaccesible
cout << "Público = " << objeto1.pub;
Accesibilidad en herencia private
| Accesibilidad | miembros privados | miembros protegidos | miembros públicos |
|---|---|---|---|
| Clase Base | Sí | Sí | Sí |
| Clase Derivada | No | Sí (heredados como variables privadas) | Sí (heredados como variables privadas) |
Lenguaje C
- Estructuras vs Clases en C++: Guía práctica para desarrolladores embebidos
- Sigfox lanza red de área privada, mejora geolocalización y expande soluciones IoT
- Eligiendo la estrategia cloud correcta: soluciones públicas, privadas e híbridas explicadas
- Nube pública: beneficios, riesgos y consideraciones clave
- Nube privada: ventajas, desventajas y cómo protege los datos de su empresa
- Dominando Variables, Literales y Constantes en C++: Guía Completa
- Clases y Objetos en C++: Guía Práctica de Programación Orientada a Objetos
- Dominando la gestión de memoria en C++: uso experto de new y delete
- Funciones y clases amigas en C++: dominando el control de acceso
- Operadores en C++ explicados: Tipos, ejemplos y programas de muestra
- Struct vs Class en C++: Diferencias Clave, Sintaxis y Mejores Casos de Uso