Dominando Herança em C++: Public, Protected & Private Explicados
Herança Public, Protected e Private em C++
Neste tutorial, aprenderemos a usar herança public, protected e private em C++ com a ajuda de exemplos.
Na herança 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 nos modos protected ou private.
Essas 3 palavras-chave (public, protected e private) são conhecidas como especificadores de acesso na herança C++.
Herança public, protected e private em C++
public, protected, e private herança têm as seguintes características:
- herança public torna membros
publicda classe basepublicna classe derivada, e membrosprotectedda classe base permanecemprotectedna classe derivada. - herança protected torna membros
publiceprotectedda classe baseprotectedna classe derivada. - herança private torna membros
publiceprotectedda classe baseprivatena classe derivada.
Nota: Membros private da classe base são inacessíveis à classe derivada.
class Base { public: int x; protected: int y; private: int z; }; class PublicDerived: public Base { // x é public // y é protected // z não é acessível de PublicDerived }; class ProtectedDerived: protected Base { // x é protected // y é protected // z não é acessível de ProtectedDerived }; class PrivateDerived: private Base { // x é private // y é private // z não é acessível de PrivateDerived }
Exemplo 1: Herança public em C++
// Programa C++ para demonstrar o funcionamento da herança public #include <iostream> using namespace std; class Base { private: int pvt = 1; protected: int prot = 2; public: int pub = 3; // função para acessar membro private int getPVT() { return pvt; } }; class PublicDerived : public Base { public: // função para acessar membro protected da 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; }
Saída
Private = 1 Protected = 2 Public = 3
Aqui, derivamos PublicDerived de Base no modo público.
Como resultado, em PublicDerived:
- prot é herdado como protected.
- pub e
getPVT()são herdados como public. - pvt é inacessível pois é private em
Base.
Como membros private e protected não são acessíveis de main(), precisamos criar funções públicas getPVT() e getProt() para acessá-los:
// Erro: membro "Base::pvt" é inacessível cout << "Private = " << object1.pvt; // Erro: membro "Base::prot" é inacessível cout << "Protected = " << object1.prot;
Observe que a função getPVT() foi definida dentro de Base. Mas a função getProt() foi definida dentro de PublicDerived.
Isso ocorre porque pvt, que é private em Base, é inacessível a PublicDerived.
No entanto, prot é acessível a PublicDerived devido à herança pública. Portanto, getProt() pode acessar a variável protected de dentro de PublicDerived.
Acessibilidade na Herança public
| Acessibilidade | membros private | membros protected | membros public |
|---|---|---|---|
| Classe Base | Sim | Sim | Sim |
| Classe Derivada | Não | Sim | Sim |
Exemplo 2: Herança protected em C++
// Programa C++ para demonstrar o funcionamento da herança protected #include <iostream> using namespace std; class Base { private: int pvt = 1; protected: int prot = 2; public: int pub = 3; // função para acessar membro private int getPVT() { return pvt; } }; class ProtectedDerived : protected Base { public: // função para acessar membro protected da Base int getProt() { return prot; } // função para acessar membro public da Base int getPub() { return pub; } }; int main() { ProtectedDerived object1; cout << "Private não pode ser acessado." << endl; cout << "Protected = " << object1.getProt() << endl; cout << "Public = " << object1.getPub() << endl; return 0; }
Saída
Private não pode ser acessado. Protected = 2 Public = 3
Aqui, derivamos ProtectedDerived de Base no modo protected.
Como resultado, em ProtectedDerived:
- prot, pub e
getPVT()são herdados como protected. pvté inacessível pois é private emBase.
Como sabemos, membros protected não podem ser acessados diretamente de fora da classe. Como resultado, não podemos usar getPVT() de ProtectedDerived.
É também por isso que precisamos criar a função getPub() em ProtectedDerived para acessar a variável pub.
// Erro: membro "Base::getPVT()" é inacessível cout << "Private = " << object1.getPVT(); // Erro: membro "Base::pub" é inacessível cout << "Public = " << object1.pub;
Acessibilidade na Herança protected
| Acessibilidade | membros private | membros protected | membros public |
|---|---|---|---|
| Classe Base | Sim | Sim | Sim |
| Classe Derivada | Não | Sim | Sim (herdados como variáveis protected) |
Exemplo 3: Herança private em C++
// Programa C++ para demonstrar o funcionamento da herança private #include <iostream> using namespace std; class Base { private: int pvt = 1; protected: int prot = 2; public: int pub = 3; // função para acessar membro private int getPVT() { return pvt; } }; class PrivateDerived : private Base { public: // função para acessar membro protected da Base int getProt() { return prot; } // função para acessar membro private int getPub() { return pub; } }; int main() { PrivateDerived object1; cout << "Private não pode ser acessado." << endl; cout << "Protected = " << object1.getProt() << endl; cout << "Public = " << object1.getPub() << endl; return 0; }
Saída
Private não pode ser acessado. Protected = 2 Public = 3
Aqui, derivamos PrivateDerived de Base no modo private.
Como resultado, em PrivateDerived:
- prot,
pubegetPVT()são herdados como private. - pvt é inacessível pois é private em
Base.
Como sabemos, membros privados não podem ser acessados diretamente de fora da classe. Como resultado, não podemos usar getPVT() de PrivateDerived.
É também por isso que precisamos criar a função getPub() em PrivateDerived para acessar a variável pub.
// Erro: membro "Base::getPVT()" é inacessível cout << "Private = " << object1.getPVT(); // Erro: membro "Base::pub" é inacessível cout << "Public = " << object1.pub;
Acessibilidade na Herança private
| Acessibilidade | membros private | membros protected | membros public |
|---|---|---|---|
| Classe Base | Sim | Sim | Sim |
| Classe Derivada | Não | Sim (herdados como variáveis private) | Sim (herdados como variáveis private) |
Linguagem C
- Escolhendo a Estratégia de Nuvem Certa: Soluções Pública, Privada e Híbrida Explicadas
- Nuvem Pública: Benefícios, Riscos e Considerações Essenciais
- Nuvem Privada: Vantagens, Desvantagens e Como Protege Seus Dados Corporativos
- Dominando Variáveis, Literais e Constantes em C++: Guia Completo
- Classes e Objetos em C++: Guia Prático de Programação Orientada a Objetos
- Dominando Gerenciamento de Memória em C++: Uso Expert de new e delete
- Funções Amigas e Classes Amigas em C++: Dominando o Controle de Acesso
- Estruturas vs Classes em C++: Guia Prático para Desenvolvedores Embarcados
- Sigfox Lança Rede Privada, Aprimora Geolocalização e Expande Soluções IoT
- C++ Struct vs Class: Diferenças Principais, Sintaxe e Melhores Casos de Uso