Aula 11 - Herança e Polimorfismo 🌳
O Propósito da Herança
- Criar novas classes baseadas em classes existentes.
- "É um" (Is-a relationship): Cachorro é um Animal.
Sintaxe da Herança
class Animal { ... };
class Cachorro : public Animal { ... };
Tipos de Herança
public: Mantém os níveis de acesso da base.
private: Torna tudo privado na filha.
protected: Tudo vira protegido na filha.
Revisitando: protected
- Membros visíveis para a classe e suas descendentes.
- Escondidos do mundo externo.
Sobrescrita de Métodos (Overriding)
- Redefinir o comportamento de um método na classe filha.
O Problema do Type Slicing
- Quando tratamos um objeto filho como pai e perdemos as partes do filho.
- Resolvido com Ponteiros e Referências!
O que é Polimorfismo?
- Permitir que diferentes objetos reajam à mesma mensagem de formas diferentes.
Funções Virtuais (virtual)
- Permitem que a escolha da função ocorra em tempo de execução (Dynamic Binding).
virtual void emitirSom();
Importância do virtual
- Sem
virtual, se você usar um ponteiro Animal* apontando para Cachorro, ele chamará o emitirSom do Animal!
override (C++11)
void emitirSom() override;
- Garante que você está realmente sobrescrevendo algo.
final (C++11)
- Impede que uma classe ou método seja herdado/sobrescrito.
Funções Virtuais Puras
virtual void mover() = 0;
- Indica que a classe deve implementar este método.
Classes Abstratas
- Classes que possuem pelo menos uma função virtual pura.
- Não podem ser instanciadas (
new Animal() daria erro).
Interfaces no C++
- Criadas usando classes puramente abstratas (apenas métodos virtuais puros).
Ordem de Destruição
- Sempre torne o destrutor da classe base
virtual.
- Caso contrário, a parte da classe filha pode nunca ser liberada!
Herança Múltipla
- C++ permite herdar de várias classes base simultaneamente.
class Cyborg : public Humano, public Robot { ... };
O Problema do Diamante
- Quando duas classes herdam do mesmo pai e uma quarta herda de ambas.
- Resolvido com Herança Virtual.
Upcasting e Downcasting
- Upcast: Da filha para a base (Seguro e automático).
- Downcast: Da base para a filha (Manual e arriscado - use
dynamic_cast).
dynamic_cast
- Checa em tempo de execução se a conversão é válida.
- Retorna
nullptr se falhar.
Resumo da Aula
- Herança para reuso.
- Polimorfismo para flexibilidade.
virtual e override são seus melhores amigos.
Fim da Aula 11
- Próxima aula: Sobrecarga de Operadores!