DEV Community

Cover image for Herança
João Pedro V
João Pedro V

Posted on

Herança

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;
}
Enter fullscreen mode Exit fullscreen mode

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;
}
Enter fullscreen mode Exit fullscreen mode

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 {};
Enter fullscreen mode Exit fullscreen mode

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)