Pular para conteúdo

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!