Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Lenguaje C

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:

Nota: Los miembros 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:

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:

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:

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

  1. Estructuras vs Clases en C++: Guía práctica para desarrolladores embebidos
  2. Sigfox lanza red de área privada, mejora geolocalización y expande soluciones IoT
  3. Eligiendo la estrategia cloud correcta: soluciones públicas, privadas e híbridas explicadas
  4. Nube pública: beneficios, riesgos y consideraciones clave
  5. Nube privada: ventajas, desventajas y cómo protege los datos de su empresa
  6. Dominando Variables, Literales y Constantes en C++: Guía Completa
  7. Clases y Objetos en C++: Guía Práctica de Programación Orientada a Objetos
  8. Dominando la gestión de memoria en C++: uso experto de new y delete
  9. Funciones y clases amigas en C++: dominando el control de acceso
  10. Operadores en C++ explicados: Tipos, ejemplos y programas de muestra
  11. Struct vs Class en C++: Diferencias Clave, Sintaxis y Mejores Casos de Uso