Herança e polimorfismo

Herança em C++

A herança permite criar uma nova classe (derivada) baseada em uma classe existente (base), herdando atributos e métodos. Isso facilita a reutilização e extensão de código.

Exemplo Básico

#include <iostream>
using namespace std;

// Classe base
class Pessoa {
public:
void apresentar() {
cout << "Eu sou uma pessoa." << endl;
}
protected:
int idade;
private:
string nome;
};

// Classe derivada
class Professor : public Pessoa {
public:
void ensinar() {
cout << "Eu sou um professor." << endl;
}
};
  • Professor herda publicamente de Pessoa, podendo usar os métodos públicos e protegidos da classe base, mas não os privados.

Modificadores de acesso na herança

  • public: membros public e protected da base mantêm seus níveis na derivada.
  • protected: membros public e protected da base tornam-se protected na derivada.
  • private: todos os membros herdados tornam-se private na derivada.

Polimorfismo em C++

O polimorfismo permite que métodos com o mesmo nome tenham comportamentos diferentes, dependendo do objeto que os invoca. Em C++, o polimorfismo é alcançado principalmente com métodos virtuais e herança.

Polimorfismo em tempo de execução (dinâmico)

  • Usado com ponteiros ou referências para a classe base.
  • Métodos virtuais (virtual) permitem que a chamada ao método execute a versão correspondente à classe real do objeto.

Exemplo Prático

#include <iostream>
#include <vector>
using namespace std;

class Pessoa {
public:
virtual void apresentar() const {
cout << "Eu sou uma pessoa." << endl;
}
virtual ~Pessoa() = default; // Destrutor virtual é boa prática
};

class Professor : public Pessoa {
public:
void apresentar() const override {
cout << "Eu sou um professor." << endl;
}
};

class Aluno : public Pessoa {
public:
void apresentar() const override {
cout << "Eu sou um aluno." << endl;
}
};

int main() {
vector<Pessoa*> pessoas;
pessoas.push_back(new Pessoa());
pessoas.push_back(new Professor());
pessoas.push_back(new Aluno());

for (const Pessoa* p : pessoas) {
p->apresentar(); // Chama o método correto conforme o tipo real do objeto
}

// Liberta memória
for (Pessoa* p : pessoas) delete p;
return 0;
}
  • O método apresentar é chamado de forma polimórfica, exibindo o comportamento específico de cada classe derivada.

Resumo

  • Herança: permite criar novas classes baseadas noutras, herdando e estendendo funcionalidades.
  • Polimorfismo: permite tratar objetos de diferentes classes derivadas de forma uniforme, usando métodos virtuais para garantir o comportamento correto em tempo de execução.