Herencia pública, protegida y privada de C++
Herencia pública, protegida y privada de C++
En este tutorial, aprenderemos a usar la herencia pública, protegida y privada en C++ con la ayuda de ejemplos.
En la herencia de C++, podemos derivar una clase secundaria de la clase base en diferentes modos de acceso. Por ejemplo,
class Base {
.... ... ....
};
class Derived : public Base {
.... ... ....
};
Observe la palabra clave public en el código
class Derived : 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 protegido o privado modos.
Estas 3 palabras clave (public , protected y private ) se conocen como especificadores de acceso en herencia C++.
herencia pública, protegida y privada en C++
público , protegido, y privado la herencia tiene las siguientes características:
- herencia pública hace
publicmiembros de la clase basepublicen la clase derivada, y elprotectedlos miembros de la clase base siguen siendoprotecteden la clase derivada. - herencia protegida hace el
publicyprotectedmiembros de la clase baseprotecteden la clase derivada. - herencia privada hace el
publicyprotectedmiembros de la clase baseprivateen la clase derivada.
private los miembros de la clase base son inaccesibles para la clase derivada.
class Base {
public:
int x;
protected:
int y;
private:
int z;
};
class PublicDerived: public Base {
// x is public
// y is protected
// z is not accessible from PublicDerived
};
class ProtectedDerived: protected Base {
// x is protected
// y is protected
// z is not accessible from ProtectedDerived
};
class PrivateDerived: private Base {
// x is private
// y is private
// z is not accessible from PrivateDerived
} Ejemplo 1:herencia pública de C++
// C++ program to demonstrate the working of public inheritance
#include <iostream>
using namespace std;
class Base {
private:
int pvt = 1;
protected:
int prot = 2;
public:
int pub = 3;
// function to access private member
int getPVT() {
return pvt;
}
};
class PublicDerived : public Base {
public:
// function to access protected member from Base
int getProt() {
return prot;
}
};
int main() {
PublicDerived object1;
cout << "Private = " << object1.getPVT() << endl;
cout << "Protected = " << object1.getProt() << endl;
cout << "Public = " << object1.pub << endl;
return 0;
} Salida
Private = 1 Protected = 2 Public = 3
Aquí, hemos derivado PublicDerived de Base en modo público .
Como resultado, en PublicDerived :
- protección se hereda como protegido .
- bar y
getPVT()se heredan como public . - pvt es inaccesible ya que es privado en
Base.
Desde privado y protegido los miembros no son accesibles desde main() , necesitamos crear funciones públicas getPVT() y getProt() para acceder a ellos:
// Error: member "Base::pvt" is inaccessible
cout << "Private = " << object1.pvt;
// Error: member "Base::prot" is inaccessible
cout << "Protected = " << object1.prot;
Observe que el getPVT() la función ha sido definida dentro de Base . Pero el getProt() la función ha sido definida dentro de PublicDerived .
Esto se debe a que pvt , que es privado en Base , es inaccesible para PublicDerived .
Sin embargo, prot es accesible para PublicDerived por herencia pública. Entonces, getProt() puede acceder a la variable protegida desde PublicDerived .
Accesibilidad en herencia pública
| Accesibilidad | miembros privados | miembros protegidos | miembros públicos |
|---|---|---|---|
| Clase base | Sí | Sí | Sí |
| Clase derivada | No | Sí | Sí |
Ejemplo 2:herencia protegida de C++
// C++ program to demonstrate the working of protected inheritance
#include <iostream>
using namespace std;
class Base {
private:
int pvt = 1;
protected:
int prot = 2;
public:
int pub = 3;
// function to access private member
int getPVT() {
return pvt;
}
};
class ProtectedDerived : protected Base {
public:
// function to access protected member from Base
int getProt() {
return prot;
}
// function to access public member from Base
int getPub() {
return pub;
}
};
int main() {
ProtectedDerived object1;
cout << "Private cannot be accessed." << endl;
cout << "Protected = " << object1.getProt() << endl;
cout << "Public = " << object1.getPub() << endl;
return 0;
}
Salida
Private cannot be accessed. Protected = 2 Public = 3
Aquí, hemos derivado ProtectedDerived de Base en modo protegido .
Como resultado, en ProtectedDerived :
- protección , bar y
getPVT()se heredan como protegidos . pvtes inaccesible ya que es privado enBase.
Como sabemos, protegido no se puede acceder directamente a los miembros desde fuera de la clase. Como resultado, no podemos usar getPVT() de ProtectedDerived .
Por eso también necesitamos crear el getPub() función en ProtectedDerived para acceder al pub variables.
// Error: member "Base::getPVT()" is inaccessible
cout << "Private = " << object1.getPVT();
// Error: member "Base::pub" is inaccessible
cout << "Public = " << object1.pub; Accesibilidad en herencia protegida
| Accesibilidad | miembros privados | miembros protegidos | miembros públicos |
|---|---|---|---|
| Clase base | Sí | Sí | Sí |
| Clase derivada | No | Sí | Sí (se heredan como variables protegidas) |
Ejemplo 3:herencia privada de C++
// C++ program to demonstrate the working of private inheritance
#include <iostream>
using namespace std;
class Base {
private:
int pvt = 1;
protected:
int prot = 2;
public:
int pub = 3;
// function to access private member
int getPVT() {
return pvt;
}
};
class PrivateDerived : private Base {
public:
// function to access protected member from Base
int getProt() {
return prot;
}
// function to access private member
int getPub() {
return pub;
}
};
int main() {
PrivateDerived object1;
cout << "Private cannot be accessed." << endl;
cout << "Protected = " << object1.getProt() << endl;
cout << "Public = " << object1.getPub() << endl;
return 0;
} Salida
Private cannot be accessed. Protected = 2 Public = 3
Aquí, hemos derivado PrivateDerived de Base en modo privado .
Como resultado, en PrivateDerived :
- protección ,
pubygetPVT()se heredan como privados . - pvt es inaccesible ya que es privado en
Base.
Como sabemos, no se puede acceder directamente a los miembros privados desde fuera de la clase. Como resultado, no podemos usar getPVT() de PrivateDerived .
Por eso también necesitamos crear el getPub() función en PrivateDerived para acceder al pub variables.
// Error: member "Base::getPVT()" is inaccessible
cout << "Private = " << object1.getPVT();
// Error: member "Base::pub" is inaccessible
cout << "Public = " << object1.pub; Accesibilidad en herencia privada
| Accesibilidad | miembros privados | miembros protegidos | miembros públicos |
|---|---|---|---|
| Clase base | Sí | Sí | Sí |
| Clase derivada | No | Sí (se heredan como variables privadas) | Sí (se heredan como variables privadas) |
Lenguaje C
- Nube pública Vs Nube privada Vs Nube híbrida
- Ventajas y desventajas de la nube pública
- Ventajas y desventajas de la nube privada
- Variables, literales y constantes de C++
- Clases y objetos de C++
- Gestión de memoria C++:nuevo y eliminar
- Función amiga de C++ y Clases amigas
- Estructuras y clases en C ++
- La red de área privada se basa en la red pública de Sigfox
- Operadores en C++ con Ejemplo:Qué es, Tipos y Programas
- Diferencia entre estructura y clase:explicada con el ejemplo de C++