C++ POO Intermediário
Herança e virtual
A herança permite criar classes que reutilizam e estendem o comportamento de outra classe. Em C++, usamos herança pública para expressar a relação "é um": a classe derivada herda os membros públicos e protegidos da classe base. Métodos marcados como virtual podem ser sobrescritos na classe derivada, e a chamada é resolvida em tempo de execução (polimorfismo dinâmico). As palavras-chave override e final ajudam a evitar erros: override garante que você está realmente sobrescrevendo um método virtual, e final impede que a classe ou o método seja herdado/sobrescrito. Além disso, quando uma classe base possui métodos virtuais, seu destrutor também deve ser virtual para garantir que o destrutor correto seja chamado ao deletar um objeto via ponteiro para a base.
Pontos-chave
- Herança pública (
class Derivada : public Base) estabelece a relação "é um" e mantém a acessibilidade dos membros. - Métodos virtuais permitem polimorfismo: a implementação chamada depende do tipo dinâmico do objeto.
overrideverifica em tempo de compilação se o método realmente sobrescreve um virtual da base.finalimpede que uma classe seja herdada ou que um método virtual seja sobrescrito.- Se a classe base tem métodos virtuais, o destrutor deve ser virtual para evitar vazamentos ao deletar via ponteiro para a base.
#include <iostream>
#include <memory>
#include <vector>
class Animal {
public:
virtual void falar() const {
std::cout << "Animal faz som\n";
}
virtual ~Animal() = default; // destrutor virtual
};
class Cachorro : public Animal {
public:
void falar() const override {
std::cout << "Cachorro late\n";
}
};
class Gato final : public Animal {
public:
void falar() const override {
std::cout << "Gato mia\n";
}
};
int main() {
std::vector<std::unique_ptr<Animal>> animais;
animais.push_back(std::make_unique<Cachorro>());
animais.push_back(std::make_unique<Gato>());
animais.push_back(std::make_unique<Animal>());
for (const auto& a : animais) {
a->falar(); // chamada polimórfica
}
return 0;
}