O que é herança?
Herança é um relacionamento entre duas classes onde uma herda características da outra.
Lembra que a classe é uma definição de um "molde" que vamos usar na hora de criar um objeto? Então, é como se estivéssemos criando um novo molde que é uma extensão do molde anterior.
Tornando isso mais próximo da programação e se afastando um pouco da analogia de "moldes", imagine que você tenha duas classes, "Cliente" e "Funcionário". Nesse caso posso imaginar que os primeiros atributos que naturalmente começam a surgir na sua mente são coisas como "Nome", "CPF", e talvez "idade", certo?
Você pode ter imaginado outras coisas como "cargo" para funcionário ou "endereço" para cliente.
Mas agora começa a acontecer algo interessante se tentarmos escrever este código.
#include <iostream>
#include <string>
using namespace std;
class Funcionario {
public:
string nome;
string cpf;
int idade;
string cargo;
Funcionario(string nome, string cpf, int idade, string cargo){
this->nome = nome;
this->cpf = cpf;
this->idade = idade;
this->cargo = cargo;
}
};
class Cliente {
public:
string nome;
string cpf;
int idade;
string endereco;
Cliente(string nome, string cpf, int idade, string cargo){
this->nome = nome;
this->cpf = cpf;
this->idade = idade;
this->endereco = endereco;
}
};
int main()
{
Funcionario *f = new Funcionario("Claudio", "123.456.678-90", 42, "Gerente de vendas");
Cliente *c = new Cliente("Julia", "098.876.543-21", 33, "Pq. Carvalho Negro R. Alameda Imbuia 123");
cout << c->nome << "\n";
cout << f->nome << "\n";
return 0;
}
Note que temos três linhas duplicadas nessas três classes, isso por que abstraímos todos os cargos na classe "funcionário", se os funcionários tivessem métodos e atributos distintos teríamos que criar uma classe pra cada um, aumentando ainda mais a duplicação de atributos.
Existe uma forma mais elegante de resolver isso, que é através da herança.
Quando você começou a imaginar os atributos nome, cpf e idade quando eu mencionei que iria implementar as classes Funcionario e Cliente, você sabia que isso era uma característica que eles tinham em comum.
Mas a característica de um "Nome" não é algo característico de cliente e nem de funcionário, você sabia que ambos tinham um nome porque normalmente ambos são pessoas.
Portanto, por serem pessoas, ambos herdam a característica de ter um nome.
E é possível expressar isso na forma de código também, através da herança de classes.
Podemos fazer classes herdarem métodos e atributos protegidos e públicos de outras classes através desse relacionamento, como no exemplo abaixo:
#include <iostream>
#include <string>
using namespace std;
class Pessoa {
public:
int idade;
string nome;
string tipo_sanguineo;
void respirar(){
std::cout << this->nome << " está respirando\n\n";
}
};
class Funcionario : public Pessoa {
public:
string cargo; // Note que "cargo" é o único atributo declarado na classe Funcionario
void trabalhar(){
std::cout << this->nome << " está trabalhando\ncargo: " << this->cargo << "\n\n";
}
};
int main()
{
Pessoa Rhanny;
Rhanny.idade = 27;
Rhanny.nome = "Rhanny Gallahar";
Rhanny.tipo_sanguineo = "-O";
Rhanny.respirar(); // Chamando método da classe Pessoa
Funcionario Emma;
Emma.idade = 36; // Atribuição de valor a um atributo que é da classe Pessoa
Emma.nome = "Emma Ayers";
Emma.tipo_sanguineo = "+A";
Emma.cargo = "Mestra arcanista"; // Atribuição de valor a um atributo da classe Funcionario
Emma.trabalhar(); // Chamando método da classe Funcionario
Emma.respirar(); // Chamando método da classe Pessoa
return 0;
}
No exemplo acima eu ignorei a existência da classe Cliente porque o foco aqui é o relacionamento entre as classes Pessoa e Funcionario.
Note no exemplo que apesar de Emma ser um funcionário, e na definição da classe Funcionario não ter nenhuma menção a um método respirar(), é possível chamar o método respirar() através dela.
Isso acontece por conta da linha que cria a classe funcionário.
// Criando a classe Pessoa
class Pessoa {};
// Criando a classe Funcionario de forma que ela herde tudo que for protegido e público da classe.
class Funcionario : public Pessoa {};
Espero ter conseguido esclarecer o conceito de herança. Qualquer dúvida ou sugestão, pode deixar nos comentários ou entrar em contato comigo.
Bons estudos ;)
Top comments (0)