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 public
no 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
, protected
e 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
public
membros da classe basepublic
na classe derivada e osprotected
membros da classe base permanecemprotected
na classe derivada. - herança protegida torna os membros
public
eprotected
da classe baseprotected
na classe derivada. - a herança privada torna os membros
public
eprotected
da classe baseprivate
na 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 PublicDerived
a partir Base
de 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 ProtectedDerived
a partir Base
de modo protegido .
Como resultado, em ProtectedDerived
:
- prot, pub e
getPVT()
são herdados como protegidos . pvt
está inacessível porque é privado emBase
.
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 ProtectedDerived
para 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 PrivateDerived
a partir Base
no modo privado .
Como resultado, em PrivateDerived
:
- prot
pub
egetPVT()
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 PrivateDerived
para 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) |