🧩 Exercícios: Herança, Polimorfismo Dinâmico, Métodos Virtuais e VTable
Spec Sistemas Com Cpp • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 11.1 — Hierarquia de Classes com Herança Pública e virtual Destructor
Contexto: Hierarquia de Classes com Herança Pública e virtual Destructor no contexto de Herança, Polimorfismo Dinâmico, Métodos Virtuais e VTable.
Requisitos de Execução:
- Criar classe base com destrutor virtual garantindo a desalocação correta de classes derivadas.
Resultado Esperado
Destrutor virtual assegura limpeza completa do objeto derivado.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_11_1_SeuNome - Envie na tarefa:
Atividade Cap 11 - Herança, Polimorfismo Dinâmico, Métodos Virtuais e VTable
🔑 Gabarito de Código & Solução Comentada
#include <iostream>
class Animal {
public:
virtual ~Animal() { std::cout << "Destrutor Animal\n"; }
virtual void emitir_som() const = 0; // Metodo puramente virtual
};
class Cachorro : public Animal {
public:
~Cachorro() override { std::cout << "Destrutor Cachorro\n"; }
void emitir_som() const override { std::cout << "Au Au!\n"; }
};
int main() {
Animal* a = new Cachorro();
a->emitir_som();
delete a;
return 0;
}
🔍 Nível 2: Prática
Problema 11.2 — Uso Obrigatório de override e final no C++ Moderno
Contexto: Uso Obrigatório de override e final no C++ Moderno no contexto de Herança, Polimorfismo Dinâmico, Métodos Virtuais e VTable.
Requisitos de Execução:
- Impedir sobrescritas acidentais com
overridee selar classe contra herança posterior comfinal.
Resultado Esperado
Compilador valida assinatura e bloqueia herança indevida em classe selada.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_11_2_SeuNome - Envie na tarefa:
Atividade Cap 11 - Herança, Polimorfismo Dinâmico, Métodos Virtuais e VTable
🔑 Gabarito de Código & Solução Comentada
#include <iostream>
class ServicoBase {
public:
virtual ~ServicoBase() = default;
virtual void autenticar() = 0;
};
class ServicoProducao final : public ServicoBase {
public:
void autenticar() override { std::cout << "Autenticado via SSO Corporativo.\n"; }
};
int main() {
ServicoProducao s;
s.autenticar();
return 0;
}
⚡ Nível 3: Integração
Problema 11.3 — Inspeção Conceitual da Tabela de Métodos Virtuais (VTable/VPtr)
Contexto: Inspeção Conceitual da Tabela de Métodos Virtuais (VTable/VPtr) no contexto de Herança, Polimorfismo Dinâmico, Métodos Virtuais e VTable.
Requisitos de Execução:
- Demonstrar como o despacho dinâmico de métodos virtuais utiliza ponteiro VPtr indexando a VTable em tempo de execução.
Resultado Esperado
Despacho polimórfico dinâmico executado via ponteiro de classe base.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_11_3_SeuNome - Envie na tarefa:
Atividade Cap 11 - Herança, Polimorfismo Dinâmico, Métodos Virtuais e VTable
🔑 Gabarito de Código & Solução Comentada
#include <iostream>
#include <vector>
#include <memory>
struct Forma { virtual ~Forma() = default; virtual double area() const = 0; };
struct Retangulo : Forma {
double l, a;
Retangulo(double l, double a) : l(l), a(a) {}
double area() const override { return l * a; }
};
int main() {
std::vector<std::unique_ptr<Forma>> formas;
formas.push_back(std::make_unique<Retangulo>(10, 5));
std::cout << "Area polimorfica: " << formas[0]->area() << std::endl;
return 0;
}
🏆 Nível 4: Desafio Corporativo
Problema 11.4 — Polimorfismo Estático com CRTP (Curiously Recurring Template Pattern)
Contexto: Polimorfismo Estático com CRTP (Curiously Recurring Template Pattern) no contexto de Herança, Polimorfismo Dinâmico, Métodos Virtuais e VTable.
Requisitos de Execução:
- Implementar polimorfismo em tempo de compilação eliminando o custo de VTable via CRTP.
Resultado Esperado
Despacho polimórfico resolvido 100% em tempo de compilação sem overhead de VPtr.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_11_4_SeuNome - Envie na tarefa:
Atividade Cap 11 - Herança, Polimorfismo Dinâmico, Métodos Virtuais e VTable
🔑 Gabarito de Código & Solução Comentada
#include <iostream>
template <typename T>
struct InterfaceCRTP {
void executar() { static_cast<T*>(this)->implementacao(); }
};
struct DriverConcreto : InterfaceCRTP<DriverConcreto> {
void implementacao() { std::cout << "Driver CRTP executado com Zero Overhead!\n"; }
};
int main() {
DriverConcreto d;
d.executar();
return 0;
}