Capítulo 15: Polimorfismo (Muitas Formas) 🧙‍♂️⚔️

Neste capítulo, vamos aprender o conceito mais avançado da POO: o Polimorfismo, usando o tema de Classes de RPG!


📖 O que é Polimorfismo?

Polimorfismo significa “muitas formas”. Na programação, permite que tratemos objetos de diferentes classes de forma uniforme, desde que herdem da mesma classe base. O método chamado será o da classe específica do objeto, graças às funções virtuais (virtual)!


📖 Exemplo Guiado: Ataque de Classes de RPG

Vamos criar uma classe base Personagem com um método atacar(). Depois, criaremos Guerreiro e Mago que atacam de formas diferentes!

  1. Crie o arquivo rpg_polimorfismo.cpp na pasta src/:
#include <iostream>
#include <string>
 
using namespace std;
 
// Classe Base
class Personagem {
public:
    string nome;
 
    Personagem(string n) { nome = n; }
 
    // O comando 'virtual' permite o polimorfismo!
    virtual void atacar() {
        cout << nome << " fez um ataque basico!" << endl;
    }
};
 
// Subclasse Guerreiro
class Guerreiro : public Personagem {
public:
    Guerreiro(string n) : Personagem(n) {}
 
    // Sobrescrevendo o método
    void atacar() override {
        cout << nome << " atacou com a Espada Gigante! ⚔️" << endl;
    }
};
 
// Subclasse Mago
class Mago : public Personagem {
public:
    Mago(string n) : Personagem(n) {}
 
    // Sobrescrevendo o método
    void atacar() override {
        cout << nome << " lancou uma Bola de Fogo! 🔥" << endl;
    }
};
 
int main() {
    // Usando ponteiros da classe base para apontar para objetos das filhas!
    Personagem* heroi1 = new Guerreiro("Arthur");
    Personagem* heroi2 = new Mago("Merlin");
 
    cout << "--- Turno de Ataque ---" << endl;
    
    // Mesmo chamando o mesmo método, o resultado é diferente!
    heroi1->atacar();
    heroi2->atacar();
 
    // Liberando memória
    delete heroi1;
    delete heroi2;
 
    return 0;
}

🕹️ Como Executar e Testar no VS Code

  1. Abra o terminal integrado.
  2. Compile: g++ rpg_polimorfismo.cpp -o rpg_polimorfismo
  3. Execute: ./rpg_polimorfismo

Resultado Esperado:

--- Turno de Ataque ---
Arthur atacou com a Espada Gigante! ⚔️
Merlin lancou uma Bola de Fogo! 🔥

📊 Ilustração Visual: Polimorfismo

O mesmo comando atacar() gera ações diferentes dependendo do objeto real:

graph TD
    A["Chamada: heroi->atacar()"] -->|Se for Guerreiro| B["⚔️ Espada"]
    A -->|Se for Mago| C["🔥 Magia"]

🛠️ Prática Obrigatória 1: Sons de Animais/Monstros

Crie um programa chamado sons_monstros.cpp com uma classe base Monstro que tenha o método virtual void rugir(). Crie as subclasses Dragao e Zumbi que rugem de formas diferentes. Teste usando ponteiros da classe base!


🔑 Gabarito de Código

Prática 1: sons_monstros.cpp

#include <iostream>
#include <string>
 
using namespace std;
 
class Monstro {
public:
    string nome;
    Monstro(string n) { nome = n; }
    virtual void rugir() {
        cout << nome << " fez um som generico." << endl;
    }
};
 
class Dragao : public Monstro {
public:
    Dragao(string n) : Monstro(n) {}
    void rugir() override {
        cout << nome << " diz: ROOOOOOARRRR! (Cospe fogo) 🐲" << endl;
    }
};
 
class Zumbi : public Monstro {
public:
    Zumbi(string n) : Monstro(n) {}
    void rugir() override {
        cout << nome << " diz: Grrrrr... Cerebros... 🧟" << endl;
    }
};
 
int main() {
    Monstro* m1 = new Dragao("Smaug");
    Monstro* m2 = new Zumbi("Walker");
 
    cout << "--- Monstros Rugindo ---" << endl;
    m1->rugir();
    m2->rugir();
 
    delete m1;
    delete m2;
 
    return 0;
}

📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)

(Siga o padrão estabelecido no Guia)


Capitulo Anterior | Proximo Capitulo