Herencia pública, protegida y privada en la programación 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 publicen 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, protectedy 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 publicmiembros de la clase base publicen la clase derivada y los protectedmiembros de la clase base permanecen protecteden la clase derivada.
  • La herencia protegida hace que los miembros publicy protectedde la clase base protecteden la clase derivada.
  • la herencia privada hace que publicy protectedmiembros de la clase base privateen 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 PublicDeriveda partir Basede 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 ProtectedDerivedde Baseen modo protegido .

Como resultado, en ProtectedDerived:

  • prot, pub y getPVT()se heredan como protegidos .
  • pvtes inaccesible ya que es privado en Base.

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 ProtectedDerivedpara 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 PrivateDeriveda partir Basede modo privado .

Como resultado, en PrivateDerived:

  • prot, puby getPVT()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 PrivateDerivedpara 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)

Articulos interesantes...