Herança pública, protegida e privada na programação C ++

Neste tutorial, aprenderemos a usar herança pública, protegida e privada em C ++ com a ajuda de exemplos.

Na herança de C ++, podemos derivar uma classe filha da classe base em diferentes modos de acesso. Por exemplo,

 class Base (… .… … . ); class Derived : public Base (… .… … . );

Observe a palavra-chave publicno código

 class Derived : public Base

Isso significa que criamos uma classe derivada da classe base no modo público . Alternativamente, também podemos derivar classes em modos protegidos ou privados .

Essas 3 palavras-chave ( public, protectede private) são conhecidas como especificadores de acesso na herança de C ++.

herança pública, protegida e privada em C ++

herança pública , protegida e privada têm os seguintes recursos:

  • a herança pública torna os publicmembros da classe base publicna classe derivada e os protectedmembros da classe base permanecem protectedna classe derivada.
  • herança protegida torna os membros publice protectedda classe base protectedna classe derivada.
  • a herança privada torna os membros publice protectedda classe base privatena classe derivada.

Nota: private membros da classe base são inacessíveis para a classe 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 )

Exemplo 1: Herança pública 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; )

Resultado

 Privado = 1 Protegido = 2 Público = 3

Aqui, nós deduzimos PublicDeriveda partir Basede modo público .

Como resultado, em PublicDerived:

  • prot é herdado como protegido .
  • pub e getPVT()são herdados como públicos .
  • pvt está inacessível porque é privado em Base.

Uma vez que membros privados e protegidos não são acessíveis, precisamos criar funções públicas getPVT()e getProt()acessá-las:

 // Error: member "Base::pvt" is inaccessible cout << "Private = " << object1.pvt; // Error: member "Base::prot" is inaccessible cout << "Protected = " << object1.prot;

Acessibilidade em herança pública

Acessibilidade membros privados membros protegidos membros públicos
Classe Base sim sim sim
Classe derivada Não sim sim

Exemplo 2: Herança protegida 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; )

Resultado

Privado não pode ser acessado. Protegido = 2 Público = 3

Aqui, nós deduzimos ProtectedDeriveda partir Basede modo protegido .

Como resultado, em ProtectedDerived:

  • prot, pub e getPVT()são herdados como protegidos .
  • pvtestá inacessível porque é privado em Base.

Como sabemos, membros protegidos não podem ser acessados ​​diretamente.

Como resultado, não podemos usar getPVT()de ProtectedDerived. É também por isso que precisamos criar a getPub()função em ProtectedDerivedpara acessar a variável pub.

 // Error: member "Base::getPVT()" is inaccessible cout << "Private = " << object1.getPVT(); // Error: member "Base::pub" is inaccessible cout << "Public = " << object1.pub;

Acessibilidade em herança protegida

Acessibilidade membros privados membros protegidos membros públicos
Classe Base sim sim sim
Classe derivada Não sim Sim (herdado como variáveis ​​protegidas)

Exemplo 3: Herança privada 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; )

Resultado

Privado não pode ser acessado. Protegido = 2 Público = 3

Aqui, nós deduzimos PrivateDeriveda partir Baseno modo privado .

Como resultado, em PrivateDerived:

  • prot pube getPVT()são herdados como privados .
  • pvt está inacessível porque é privado em Base.

Como sabemos, membros privados não podem ser acessados ​​diretamente.

Como resultado, não podemos usar getPVT()de PrivateDerived. É também por isso que precisamos criar a getPub()função em PrivateDerivedpara acessar a variável pub.

 // Error: member "Base::getPVT()" is inaccessible cout << "Private = " << object1.getPVT(); // Error: member "Base::pub" is inaccessible cout << "Public = " << object1.pub;

Acessibilidade em herança privada

Acessibilidade membros privados membros protegidos membros públicos
Classe Base sim sim sim
Classe derivada Não Sim (herdado como variáveis ​​privadas) Sim (herdado como variáveis ​​privadas)

Artigos interessantes...