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!
- Crie o arquivo
rpg_polimorfismo.cppna pastasrc/:
#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
- Abra o terminal integrado.
- Compile:
g++ rpg_polimorfismo.cpp -o rpg_polimorfismo - 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)