O significado literal do termo “herança” significa derivar características dos ancestrais. Da mesma forma, em programação , o conceito de herança gira em torno da ideia de herdar as propriedades de uma classe por suas subclasses. A classe pai cujas propriedades estão sendo herdadas é conhecida como a classe base e todas as classes que herdam da classe base são as classes derivadas. Este é um dos recursos mais importantes da programação orientada a objetos . A herança aumenta a eficiência de um programa, fornecendo vantagens como capacidade de reutilização de código e ocultação de dados.
Compreenda o conceito de herança com a ajuda de um exemplo da vida real. Considere que existem 3 classes: Inglês, Física e Matemática. Todos os três têm funções-marcas (), total_students () e faculdade (). Em vez de criar três classes separadas com as mesmas funções, você pode criar uma única classe Assunto com essas funções comuns, que podem ser herdadas por essas 3 classes. A seguinte ilustração esquemática explica isso:
Sem usar o conceito de herança, classes separadas com funções comuns causariam redundância no programa.
Depois de usar o conceito de herança, você pode usar a capacidade de reutilização do código para aumentar a eficiência do programa e também tornar o código mais limpo. A ilustração esquemática acima mostra como você pode combinar três classes redundantes com recursos comuns em uma classe cujos membros podem ser herdados por outras classes derivadas.
Herança única em C ++
A herança na qual uma única classe derivada é herdada de uma única classe base é conhecida como Herança Única. É o mais simples entre todos os tipos de herança, pois não inclui nenhum tipo de combinação de herança ou diferentes níveis de herança. A classe filha pode herdar todos os membros da classe base de acordo com o modo de visibilidade (ou seja, privado, protegido e público) que é especificado durante a herança. No entanto, é opcional definir o modo de visibilidade durante a herança. Se você não definir, ele define o modo de visibilidade como privado por padrão.
Sintaxe para implementar herança única em C ++
A seguinte sintaxe pode ser usada para obter herança única em C ++:
classe base_class_1
{
//definição de classe
};
classe associated_class: visibility_mode base_class_1
{
//definição de classe
};
Descrição da sintaxe:
- visibility_mode: fornece o modo de visibilidade na declaração da classe, pois especifica como os membros da classe base serão herdados pela classe derivada.
- base_class: este é o nome da classe da qual a classe derivada herda suas propriedades e características.
- classe derivada: este é o nome da classe derivada que pode herdar as propriedades da classe base usando o modo de visibilidade.
Ambiguidade na herança única em C ++
Ambigüidades podem surgir durante a implementação da Herança única em C ++. As ambigüidades acontecem quando existem funções com o mesmo nome e tipo de retorno na classe base e na classe derivada. Por padrão, se um objeto da classe derivada acessa tal função, a função da classe derivada é chamada (que também é chamada de substituição de função). No entanto, se quiser evitar essa situação ambígua, você pode usar um operador de resolução de escopo para definir essas funções separadamente.
O exemplo a seguir ilustra a ambigüidade e sua solução em Herança única em C ++.
#include
usando namespace std;
//classe base
organização de classe
{
privado:
nome da string;
setor de cordas;
público:
organização ()
{
nome=”ABC”;
setor=”TI”;
}
//função showName () da classe base
void showName ()
{
cout <<"O nome é:"< cout <<"O setor é:"< } }; //classe derivada funcionário da classe: organização pública { privado: nome da string; ID int; público: funcionário () { nome=”Funcionário_A”; ID=1001; } //função showName () da classe derivada void showName () { cout <<"O nome é:"< cout <<"O ID é:"< } }; int main () { //cria um objeto da classe derivada obj do funcionário; //chame a função showName () da classe base obj.organization:: showName (); cout <<"\ n"; //chame a função showName () da classe base obj.employee:: showName (); } No programa acima, o operador de resolução de escopo é usado para chamar a função showName () da classe base e a classe derivada com o mesmo nome e tipo de retorno. Sem o operador de resolução de escopo, a declaração de chamada de função será: obj.showName ();//showName () da classe derivada será chamado Quando o objeto da classe derivada chama a função showName (), a função showName () da classe derivada será chamada, substituindo o showName () da classe base. Então, depois de modificar a declaração acima para a declaração abaixo: obj.organization:: showName ();//showName () da classe base //será chamado Agora, é explicitamente especificado que o objeto faz uma chamada para a função showName () da classe base. Portanto, o showName () da classe base é chamado sem ser sobrescrito. O modo de visibilidade especifica o controle sobre os membros herdados nas classes derivadas. Uma classe pode herdar uma classe base em três modos de visibilidade em Herança Única: No modo de visibilidade pública, você pode acessar todos os membros da classe base apenas de acordo com seus especificadores de acesso. Os membros especificados como public, protected e private na classe base permanecem public, protected e private respectivamente na classe derivada. Isso significa que os membros públicos podem ser acessados pela classe derivada e também por todas as outras classes. Apenas a classe derivada e seus membros acessarão os membros protegidos, enquanto os membros privados permanecerão inacessíveis pela classe derivada. O fragmento de código a seguir ilustra como aplicar o modo de visibilidade pública em uma classe derivada em Herança única: classe base_class_1 { //membros de dados //funções de membro }; classe associated_class: public base_class_1 { //membros de dados //funções de membro }; O código a seguir exibe o funcionamento do modo de visibilidade pública com todos os três especificadores de acesso da classe base: #include usando namespace std; classe base_class { público: int var1; protegido: int var2; privado: int var3; }; //o modo de visibilidade de classe derivada é público //portanto, os especificadores de acesso permanecerão os mesmos classe associated_class: public base_class { }; //função principal int main () { obj de classe derivada; //Acessível cout <<"O valor de var1 é"< //Não acessível cout <<"O valor de var2 é"< //Não acessível cout <<"O valor de var3 é"< }; No exemplo acima, a visibilidade da classe derivada derivada_class é definida como pública, de forma que todos os especificadores de acesso permanecerão os mesmos. var1 é um membro público, portanto, pode ser acessado fora da classe derivada. var2 é um membro protegido, portanto, é acessível dentro da classe derivada, mas não fora dela, portanto, não é acessível no código fornecido. Considerando que var3 é um membro privado, portanto, não é acessível fora da classe base base_class. No modo de visibilidade privada, todos os especificadores de acesso, ou seja, privado, protegido e público tornam-se privados. Isso significa que você não pode acessá-los fora da classe em que estão definidos. Eles só podem ser acessados por meio das funções de membro da mesma classe. E uma vez que não pode herdar os membros privados, esses membros também não podem ser herdados posteriormente. O fragmento de código a seguir ilustra como aplicar o modo de visibilidade privada em uma classe derivada em Herança única: classe base_class_1 { //membros de dados //funções de membro }; classe associated_class: private base_class_1 { //membros de dados //funções de membro }; O código a seguir exibe o funcionamento do modo de visibilidade privada com todos os três especificadores de acesso da classe base: #include usando namespace std; classe base_class { público: int var1; protegido: int var2; privado: int var3; }; //o modo de visibilidade de classe derivada é privado //então todos os especificadores de acesso se tornarão privados classe associated_class: private base_class { }; //função principal int main () { obj de classe derivada; //Não acessível cout <<"O valor de var1 é"< //Não acessível cout <<"O valor de var2 é"< //Não acessível cout <<"O valor de var3 é"< }; No exemplo acima, o modo de visibilidade da classe derivada derivada_class é privado. Portanto, todos os membros da classe base tornam-se privados na classe derivada. O erro é gerado quando o objeto da classe derivada tenta acessar esses membros fora da classe. No modo de visibilidade protegido, os membros públicos e privados da classe base ficam protegidos enquanto os membros privados permanecem privados. Portanto, como resultado, os membros públicos e protegidos da classe base são acessados apenas dentro da classe derivada. Eles irão gerar um erro se você tentar acessá-los fora da classe derivada. Enquanto isso, o membro privado permanecerá inacessível fora da classe base. O fragmento de código a seguir ilustra como aplicar o modo de visibilidade protegido em uma classe derivada em Herança Única: classe base_class_1 { //membros de dados //funções de membro }; classe derivada_classe: protegida base_class_1 { //membros de dados //funções de membro }; O código a seguir exibe o funcionamento do modo de visibilidade pública com todos os três especificadores de acesso da classe base: #include usando namespace std; classe base_class { público: int var1; protegido: int var2; privado: int var3; }; //o modo de visibilidade de classe derivada é protegido //então o público se torna protegido classe derivada_classe: base_classe protegida { }; //função principal int main () { obj de classe derivada; //Não acessível cout <<"O valor de var1 é"< //Não acessível cout <<"O valor de var2 é"< //Não acessível cout <<"O valor de var3 é"< }; Neste exemplo, ele protege o modo de visibilidade da classe derivada derivada_class. Portanto, var1 se torna um membro protegido, enquanto var2 permanece o mesmo, ou seja, um membro protegido e, portanto, ambos não são acessíveis fora da classe derivada. No entanto, var3 permanece como um membro privado, portanto, não é acessível fora da classe base base_class. A tabela a seguir ilustra o controle das classes derivadas sobre os membros da classe base em diferentes modos de visibilidade em herança única: Público Protegido Privado Protegido Protegido Privado Não herdado/permanece privado Não herdado/permanece privado Não herdado/permanece privado Os exemplos a seguir ilustram a herança única em C ++. O exemplo a seguir ilustra o funcionamento do construtor padrão em Herança única. #include usando namespace std; //classe base organização de classe { público: //construtor da classe base organização () { cout <<"Eu sou o construtor da classe base \ n \ n"; } }; //classe derivada funcionário da classe: organização pública { público: //construtor da classe derivada funcionário () { cout <<"Eu sou o construtor da classe derivada \ n \ n"; } }; int main () { //cria um objeto da classe derivada obj do funcionário;//construtor da classe base //e a classe derivada serão chamadas. return 0; } No exemplo acima, a organização da classe base é herdada por um único funcionário da classe derivada. Como uma classe está herdando uma única classe base, essa é a estrutura da herança de nível único. Assim que ele cria um objeto da classe derivada, os construtores padrão da classe base e da classe derivada são chamados na mesma ordem. O exemplo a seguir ilustra o funcionamento de funções de membro e membros de dados em Herança única em C ++. #include usando namespace std; //classe base Área de aula { público: comprimento interno=10; amplitude interna=20; //função findArea () da classe base //para calcular a área int findArea () { retornar comprimento * largura; } //função para imprimir a área void printArea () { cout <<"A área calculada é:"< } }; //classe derivada Volume da classe: área pública { público: altura interna=3; //função findVolume () da classe derivada //para calcular o volume void printVolume () { //calculando o volume usando //resultado calculado na classe base. cout <<"O volume calculado é:"<<(findArea () * altura) < } }; int main () { //cria um objeto da classe derivada Volume obj; //chamar função de classe base obj. printArea (); //chamar função de classe derivada obj.printVolume (); return 0; } No exemplo acima, a classe base Area contém uma função membro findArea () que retorna e imprime a área. A classe derivada Volume acessa a função findArea () dentro de sua função printVolume () e calcula o volume usando a área retornada por findArea (). O objeto da classe derivada acessa essas funções da classe base e da classe derivada para imprimir os resultados. Avance sua carreira como desenvolvedor MEAN stack com o Desenvolvedor Web Full Stack-Programa MEAN Stack Master . Inscreva-se agora! Para resumir rapidamente o tutorial, você aprendeu um tipo importante de herança chamada herança única em C ++. Você começou com uma introdução simples à herança e gradualmente avançou com uma explicação básica de herança única em C ++. Seguindo em frente, você aprendeu a sintaxe para implementar herança única usando o conceito de classes pai e filho. Além disso, você viu uma ambigüidade na herança única chamada substituição de função, que ocorre devido à mesma assinatura de função nas classes base e também nas classes filhas. Você viu como usar modos de visibilidade em herança única para atingir o nível desejado de segurança e desempenho. Finalmente, você examinou alguns exemplos práticos de herança única em C ++. Se quiser aprender o básico de C ++, você pode verificar o guia/tutorial completo do Simplilearn em C ++ para iniciantes . Se você está procurando uma carreira brilhante na área de Full Stack Web Development, pode conferir o treinamento abrangente da Simplilearn de Desenvolvimento Web Full Stack . É um programa individualizado de 9 meses liderado por especialistas do setor que estão prontos para guiá-lo durante toda a jornada. Você aprenderá algumas das tecnologias e habilidades mais importantes que o ajudarão a conseguir uma carreira em um gigante da tecnologia de ponta. Algumas habilidades importantes que você aprenderá neste curso incluem AWS, Java e suas bibliotecas, incluindo Hibernate, Spring, etc., DevOps , Agile , JS , HTML , CSS, Servlets e muitos mais. Você também pode verificar nossa lista completa de Cursos online grátis para se aprimorar. Se você tiver alguma dúvida neste artigo sobre “Herança única em C ++” ou qualquer outra sugestão, sinta-se à vontade para deixar um comentário abaixo e nossos especialistas entrarão em contato com você o mais rápido possível. Boa aprendizagem! Modos de visibilidade em herança única
Modo de visibilidade pública
Modo de visibilidade privada
Modo de visibilidade protegida
CLASSE BASE
CLASSE DERIVADA
CLASSE DERIVADA
CLASSE DERIVADA
Público
Protegido
Privado
PÚBLICO
PROTEGIDO
PRIVADO
Exemplos de herança única em C ++
Exemplo 1
Exemplo 2
Considerações finais!