O conceito de herança no mundo da programação é análogo à herança no mundo real. No mundo real, você passa traços e características de uma geração para outra. Da mesma forma, outras subclasses derivam ou herdam as propriedades de uma classe. A classe cujos membros são herdados é a classe base ou classe pai e as subclasses que são derivadas da classe base são denominadas como classes derivadas ou classes filho. Sendo um dos principais conceitos de programação orientada a objetos , herança permite que você implemente a capacidade de reutilização do código, definindo subclasses que herdam de classes existentes.
Herança hierárquica em C ++
Herança hierárquica em C ++ refere-se ao tipo de herança que tem uma estrutura hierárquica de Aulas. Uma única classe base pode ter várias classes derivadas e outras subclasses podem herdar ainda mais essas classes derivadas, formando uma hierarquia de classes. O diagrama a seguir ilustra a estrutura da Herança hierárquica em C ++.
Agora, entenda a Herança hierárquica em C ++ com a ajuda de um exemplo. Existem 3 ramos principais derivados da ciência moderna. Eles são-Física, Química e Biologia. Esses 3 ramos são divididos em sub-ramos, que são classificados em outras disciplinas especializadas. Aqui, Ciência Moderna é a classe base que é posteriormente herdada por 3 subclasses-Física, Química e Biologia. E essas subclasses são posteriormente herdadas por outras classes derivadas, estruturadas em uma hierarquia de classes.
Uso de herança hierárquica em C ++
A herança hierárquica em C ++ é útil nos casos em que uma hierarquia deve ser mantida. A maioria das escolas e faculdades mantém os dados de seus alunos de forma hierárquica. Por exemplo, uma faculdade deve manter os dados dos alunos de engenharia e separá-los de acordo com seus ramos, como ramo de TI, ramo mecânico e assim por diante. Você pode conseguir tal cenário por Herança hierárquica em C ++ facilmente. Semelhante é o caso das empresas em que têm de manter os dados dos seus funcionários de acordo com os diferentes departamentos.
Sintaxe para implementar herança hierárquica em C ++
Você pode usar a seguinte sintaxe para obter a Herança hierárquica em C ++:
classe base_class
{
//membros de dados
//funções de membro
};
classe associated_class1: visibility_mode base_class
{
//membros de dados
//funções de membro
};
classe associated_class2: visibility_mode base_class
{
//membros de dados
//funções de membro
};
Descrição da sintaxe
- visibility_mode: fornece o modo de visibilidade na declaração da classe. Ele especifica como os membros da classe base serão herdados pela classe derivada. No caso da Herança hierárquica em C ++, ela define separadamente o modo de visibilidade com cada classe derivada durante a herança.
- base_class: este é o nome da classe da qual a classe derivada herda suas propriedades e características.
- classe derivada1: este é o nome da primeira classe derivada que herda as propriedades da classe base usando o modo de visibilidade.
- classe derivada2: este é o nome da segunda classe derivada que herda as propriedades da classe base usando o modo de visibilidade.
NOTA: pode haver um número n de classes derivadas de uma única classe base.
Modos de visibilidade em herança hierárquica em C ++
O modo de visibilidade determina o controle sobre os membros da classe base dentro das classes filhas, especificando como os recursos da classe base serão herdados pela classe derivada. Existem três tipos de modos de visibilidade de Herança hierárquica em C ++:
1. Modo de visibilidade pública
O modo de visibilidade pública não afeta o funcionamento dos especificadores de acesso. Todos os especificadores de acesso permanecem como estão. Isso significa que os membros privados permanecem privados, ou seja, não acessíveis a ninguém, os membros públicos permanecem públicos, ou seja, acessíveis em todas as classes derivadas, bem como fora das classes derivadas. E os membros protegidos permanecem protegidos, ou seja, acessíveis apenas nas classes derivadas.
O fragmento de código a seguir ilustra como aplicar o modo de visibilidade pública em uma classe derivada em Herança hierárquica em C ++:
classe base_class
{
//membros de dados
//funções de membro
};
classe associated_class1: public base_class
{
//membros de dados
//funções de membro
};
classe associated_class2: public base_class
{
//membros de dados
//funções de membro
};
NOTA: aqui, os modos de visibilidade das classes derivadas também podem ser diferentes uns dos outros.
O código a seguir ilustra o funcionamento do modo de visibilidade pública com todos os três especificadores de acesso da classe base em Herança hierárquica em C ++:
#include
usando namespace std;
classe base_class
{
público:
int var1;
protegido:
int var2;
privado:
int var3;
};
classe associated_class1: public base_class
{
//membros de dados
//funções de membro
};
classe associated_class2: public base_class
{
//membros de dados
//funções de membro
};
//função principal
int main ()
{
associated_class1 obj1;
associated_class2 obj2;
//Acessível
cout <<"O valor de var1 acessado por obj1 é"< //Acessível cout <<"O valor de var1 acessado por obj2 é"< //Não acessível cout <<"O valor de var2 acessado por obj1 é"< //Não acessível cout <<"O valor de var2 acessado por obj2 é"< //Não acessível cout <<"O valor de var3 acessado por obj1 é"< //Não acessível cout <<"O valor de var3 acessado por obj2 é"< } No exemplo acima, tanto derivado_class1 quanto derivado_classe2 têm modo de visibilidade pública, portanto, var1 sendo o membro público, é acessível pelos objetos de ambas as classes derivadas. Por outro lado, os membros privados e protegidos não são acessíveis a partir das classes derivadas. Portanto, um erro é lançado pelo compilador quando os objetos dessas classes derivadas tentam acessar os membros privados e protegidos. No modo de visibilidade privada, os especificadores de acesso público e protegido tornam-se privados. Isso torna todos os membros inacessíveis fora da classe em que estão definidos. Você só pode acessá-los por meio das funções de membro da mesma classe. E como os membros privados não podem ser herdados, você também não pode herdar mais esses membros. O fragmento de código a seguir ilustra como aplicar o modo de visibilidade privada em uma classe derivada em Herança hierárquica em C ++: classe base_class { //membros de dados //funções de membro }; classe associated_class1: private base_class { //membros de dados //funções de membro }; classe associated_class2: private base_class { //membros de dados //funções de membro }; NOTA: aqui, os modos de visibilidade das classes derivadas também podem ser diferentes uns dos outros. O código a seguir ilustra o funcionamento do modo de visibilidade privada com todos os três especificadores de acesso da classe base em Herança hierárquica em C ++: #include usando namespace std; classe base_class { público: int var1; protegido: int var2; privado: int var3; }; classe associated_class1: private base_class { //membros de dados //funções de membro }; classe associated_class2: private base_class { //membros de dados //funções de membro }; //função principal int main () { associated_class1 obj1; associated_class2 obj2; //Não acessível cout <<"O valor de var1 acessado por obj1 é"< //Não acessível cout <<"O valor de var1 acessado por obj2 é"< //Não acessível cout <<"O valor de var2 acessado por obj1 é"< //Não acessível cout <<"O valor de var2 acessado por obj2 é"< //Não acessível cout <<"O valor de var3 acessado por obj1 é"< //Não acessível cout <<"O valor de var3 acessado por obj2 é"< } No exemplo acima, derivado_classe1 e derivado_classe2 têm modo de visibilidade privado, portanto, var1, var2 e var3 tornam-se membros privados na classe derivada e não são acessíveis pelos objetos de ambas as classes derivadas. No modo de visibilidade protegida, os membros públicos ficam protegidos e os membros privados e protegidos permanecem os mesmos. Isso significa que você não pode acessar os membros públicos, assim como os membros protegidos fora das classes derivadas. Os membros privados permanecem inacessíveis mesmo nas classes derivadas e só podem ser acessados pelas funções de membro da classe na qual os membros privados são definidos. O fragmento de código a seguir ilustra como aplicar o modo de visibilidade protegido em uma classe derivada em Herança hierárquica: classe base_class { //membros de dados //funções de membro }; classe associated_class1: protegida base_class { //membros de dados //funções de membro }; classe associated_class2: base_class protegida { //membros de dados //funções de membro }; NOTA: aqui, os modos de visibilidade das classes derivadas também podem ser diferentes uns dos outros. O código a seguir ilustra o funcionamento do modo de visibilidade protegido com todos os três especificadores de acesso da classe base em Herança hierárquica: #include usando namespace std; classe base_class { público: int var1; protegido: int var2; privado: int var3; }; classe associated_class1: base_class protegida { //membros de dados //funções de membro }; classe associated_class2: base_class protegida { //membros de dados //funções de membro }; //função principal int main () { associated_class1 obj1; associated_class2 obj2; //Não acessível cout <<"O valor de var1 acessado por obj1 é"< //Não acessível cout <<"O valor de var1 acessado por obj2 é"< //Não acessível cout <<"O valor de var2 acessado por obj1 é"< //Não acessível cout <<"O valor de var2 acessado por obj2 é"< //Não acessível cout <<"O valor de var3 acessado por obj1 é"< //Não acessível cout <<"O valor de var3 acessado por obj2 é"< } No exemplo acima, tanto derivado_class1 quanto derivado_classe2 protegem o modo de visibilidade, então var1 se torna o membro protegido, enquanto var2 e var3 permanecem os mesmos. Isso torna var1 e var2 inacessíveis fora das classes derivadas, enquanto var3 permanece o mesmo, ou seja, o membro privado, portanto, não é acessível em qualquer lugar, exceto na própria classe base. O gráfico a seguir ilustra o controle das classes derivadas sobre os membros da classe base em diferentes modos de visibilidade na herança hierárquica: Público Protegido Privado Protegido Protegido Privado Não herdado Não herdado Não herdado Os exemplos a seguir ilustram a herança hierárquica em C ++. O exemplo a seguir ilustra o funcionamento do construtor padrão na Herança hierárquica. #include usando namespace std; //classe base classe universidade { público: //construtor padrão da classe base universidade () { cout <<"Eu sou o construtor padrão da classe base. \ n \ n"; } }; //classe derivada 1 herdando a classe base aluno da turma: universidade pública {}; //classe derivada 2 herdando a classe base corpo docente da turma: universidade pública {}; int main () { //crie os objetos das classes derivadas aluno obj1;//construtor da classe base será chamado corpo docente obj2;//construtor da classe base será chamado return 0; } No exemplo acima, duas classes derivadas, aluno e corpo docente, herdam a mesma universidade de classe base. Isso representa a estrutura da Herança hierárquica. O construtor padrão da classe base é chamado assim que cria os objetos de ambas as classes derivadas. O exemplo a seguir ilustra o funcionamento de membros de dados e funções de membro na Herança hierárquica em C ++. #include usando namespace std; //classe base classe universidade { privado: string university_name; público: string getUniversityName () { university_name=”Universidade XYZ”; return university_name; } }; //classe derivada 1 herdando a classe base aluno da turma: universidade pública { público: void display_student () { cout <<"Sou um aluno de"< } }; //classe derivada 2 herdando a classe base corpo docente da turma: universidade pública { público: void display_faculty () { cout <<"Sou professor na área"< } }; int main () { //objeto da classe derivada 1 aluno obj1; //chame a função display_student () da classe derivada 1 obj1.display_student (); //objeto da classe derivada 2 corpo docente obj2; //chame a função display_student () da classe derivada 2 obj2.display_faculty (); return 0; } No exemplo acima, a universidade da classe base é herdada pelas subclasses aluno e corpo docente. A função de membro público getUniversityName () está acessível a ambas as classes derivadas. As funções display_student () e display_faculty () acessam a função getUniversityName () da classe base para imprimir o nome da universidade que é comum tanto para o aluno quanto para o corpo docente. O exemplo a seguir ilustra como acessar membros de dados da classe base nas classes derivadas. #include usando namespace std; //classe base dimensão da classe { público: comprimento interno=5; amplitude interna=6; }; //classe derivada 1 perímetro da classe: dimensão pública { público: //função printPerimeter () da classe derivada 1 //para imprimir o perímetro void printPerimeter () { //calculando o perímetro usando o //dimensões na classe base. cout <<"O perímetro calculado é:"<<2 * (comprimento + largura) <<"\ n \ n"; } }; //classe derivada 2 área de aula: dimensão pública { público: //função printArea () da classe derivada 2 //para imprimir o perímetro void printArea () { //calculando a área usando o //dimensões na classe base. cout <<"A área calculada é:"<<(comprimento * largura) <<"\ n \ n"; } }; int main () { //objeto da classe derivada 1 perímetro obj1; //objeto da classe derivada 2 área obj2; //chame a função printPerimeter () da classe derivada 1 obj1.printPerimeter (); //chame a função printArea () da classe derivada 2 obj2.printArea (); return 0; } No exemplo acima, as classes derivadas-perímetro e área herdam a dimensão da classe base. Os membros de dados-comprimento e largura, da classe base são diretamente acessíveis às funções de membro das classes derivadas. As funções membro findPerimeter () e findArea () acessam as variáveis de comprimento e largura da classe base para calcular e imprimir perímetro e área, respectivamente. Avance sua carreira como desenvolvedor MEAN stack com o Desenvolvedor Web Full Stack-Programa MEAN Stack Master . Inscreva-se agora! Para resumir rapidamente, neste artigo, você aprendeu sobre os prós e contras da herança hierárquica em C ++. Você começou com uma introdução geral à herança e seus usos na vida real e então gradualmente mudou para a herança hierárquica em C ++. Você entendeu os usos da herança hierárquica e a sintaxe para implementá-la com uma combinação de classes básicas e filhas. Você entendeu a herança hierárquica com diferentes modos de visibilidade e terminou com alguns exemplos para demonstrar o uso da herança hierárquica. Se quiser entender os conceitos C ++ em mais detalhes, você pode verificar o guia completo do Simplilearn em C ++ para iniciantes . Este guia o ajudará a começar com os conceitos fundamentais de C ++. Se você deseja iniciar sua carreira profissional como Full Stack Web Developer em um grande gigante da tecnologia, verifique o Treinamento Full Stack Web Development . Este treinamento é conduzido por especialistas do setor e está disponível ao longo do curso para orientá-lo em cada etapa. Ao final do curso, você terá dominado algumas das tecnologias de tendência, como Java e suas principais bibliotecas, como Spring, Hibernate, JPA, etc., DevOps technologies , Agile , HTML , CSS , JS , etc. Se você tem um talento especial para se manter atualizado com as novas tecnologias, experimente alguns de nossos cursos online gratuitos também. Boa aprendizagem! 2. Modo de visibilidade privada
3. Modo de visibilidade protegida
CLASSE BASE
CLASSE DERIVADA
CLASSE DERIVADA
CLASSE DERIVADA
PÚBLICO
PROTEGIDO
PRIVADO
PÚBLICO
PROTEGIDO
PRIVADO
Exemplos
Exemplo 1
Exemplo 2
Exemplo 3
Considerações finais!