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 modo protegido o privado .
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 ++
La herencia pública , protegida y privada tiene las siguientes características:
- la herencia pública convierte a los
public
miembros de la clase basepublic
en la clase derivada y losprotected
miembros de la clase base permanecenprotected
en la clase derivada. - La herencia protegida hace que los miembros
public
yprotected
de la clase baseprotected
en la clase derivada. - la herencia privada hace que
public
yprotected
miembros de la clase baseprivate
en la clase derivada.
Nota: los private
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 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
Privado = 1 Protegido = 2 Público = 3
Aquí, hemos derivado PublicDerived
a partir Base
de modo público .
Como resultado, en PublicDerived
:
- prot se hereda como protegido .
- pub y
getPVT()
se heredan como public . - pvt es inaccesible ya que es privado en
Base
.
Dado que los miembros privados y protegidos no son accesibles, necesitamos crear funciones públicas getPVT()
y getProt()
acceder a ellas:
// Error: member "Base::pvt" is inaccessible cout << "Private = " << object1.pvt; // Error: member "Base::prot" is inaccessible cout << "Protected = " << object1.prot;
Accesibilidad en la herencia pública
Accesibilidad | miembros privados | miembros protegidos | miembros públicos |
---|---|---|---|
Clase base | si | si | si |
Clase derivada | No | si | si |
Ejemplo 2: herencia protegida en C ++
// C++ program to demonstrate the working of protected inheritance #include 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
No se puede acceder a privado. Protegido = 2 Público = 3
Aquí, hemos derivado ProtectedDerived
de Base
en modo protegido .
Como resultado, en ProtectedDerived
:
- prot, pub y
getPVT()
se heredan como protegidos . pvt
es inaccesible ya que es privado enBase
.
Como sabemos, no se puede acceder directamente a los miembros protegidos .
Como resultado, no podemos usar getPVT()
from ProtectedDerived
. Por eso también necesitamos crear la getPub()
función ProtectedDerived
para acceder a la variable pub.
// 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 | si | si | si |
Clase derivada | No | si | Sí (heredado como variables protegidas) |
Ejemplo 3: herencia privada de C ++
// C++ program to demonstrate the working of private inheritance #include 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
No se puede acceder a privado. Protegido = 2 Público = 3
Aquí, hemos derivado PrivateDerived
a partir Base
de modo privado .
Como resultado, en PrivateDerived
:
- prot,
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.
Como resultado, no podemos usar getPVT()
from PrivateDerived
. Por eso también necesitamos crear la getPub()
función PrivateDerived
para acceder a la variable pub.
// 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 | si | si | si |
Clase derivada | No | Sí (heredado como variables privadas) | Sí (heredado como variables privadas) |