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
public
miembros de la clase basepublic
en la clase derivada, y elprotected
los miembros de la clase base siguen siendoprotected
en la clase derivada. - herencia protegida hace el
public
yprotected
miembros de la clase baseprotected
en la clase derivada. - herencia privada hace el
public
yprotected
miembros de la clase baseprivate
en 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 . pvt
es 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 ,
pub
ygetPVT()
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++