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;
}
};
Professorherda publicamente dePessoa, 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.
