Conteúdo do Curso
C++ Poo
C++ Poo
Método Virtual Puro
O conceito de métodos virtuais é fundamental para alcançar o polimorfismo, permitindo um design de software flexível e extensível. Métodos virtuais puros ampliam esse conceito ao definir interfaces e oferecer suporte à ligação dinâmica.
Sintaxe do método virtual puro
Um método virtual puro é declarado com a palavra-chave virtual
e inicializado com zero. Isso indica que a função não possui definição dentro da class
e deve ser sobrescrita por qualquer subclasse antes que objetos dessa class
possam ser instanciados.
virtual.h
virtual void example() = 0;
Este método funciona de forma semelhante a um método padrão, exceto pelo fato de que não possui um corpo delimitado por { }
e, em vez disso, é finalizado com = 0;
, indicando ausência de implementação. No entanto, as demais regras para este método são as mesmas dos métodos regulares.
Declarar um método virtual puro torna a class
onde ele é declarado abstrata, ou seja, torna-se impossível instanciar objetos dessa classe. Essa restrição existe porque todo método dentro da class
deve ser implementado antes de criar e utilizar uma instância, a fim de evitar erros e comportamentos imprevisíveis. Observe o código abaixo:
Animal.h
class Animal { public: virtual void speak() = 0; };
A Animal
class
possui um método virtual puro chamado speak()
, impedindo a instanciação de objetos dessa classe. Essa abordagem é adequada, pois o objetivo do método virtual é representar os sons distintos que cada animal emite.
Ao tornar o método virtual, permite que cada subclasse implemente sua própria versão, refletindo a individualidade do som de cada animal. Declarar como virtual puro indica que não existe uma implementação padrão, enfatizando a necessidade de implementações concretas nas classes derivadas.
main.cpp
#include "Animal.h" int main() { // cannot declare variable 'animal' to be of abstract type Animal animal; }
Isso também é coerente. Criar instâncias da Animal
class
seria impraticável e contraditório, pois ela representa um conceito abstrato que serve como categoria para diferentes animais. Não há um comportamento específico associado a um animal genérico, reforçando o caráter abstrato da class
e destacando a importância de criar subclasses especializadas para capturar os sons únicos de cada animal específico.
main.cpp
#include <iostream> class Animal { public: // Pure virtual function to enforce implementation in derived classes virtual void speak() = 0; }; class Cat : public Animal { public: void speak() override { std::cout << "Meow!" << std::endl; } }; class Dog : public Animal { public: void speak() override { std::cout << "Bark!" << std::endl; } }; class Cow : public Animal { public: void speak() override { std::cout << "Moo!" << std::endl; } }; void pet(Animal& animal) { animal.speak(); } int main() { // Replace `Cat` with `Dog` or `Cow` to see their specific behavior Cat cat; pet(cat); }
Embora não seja possível criar um objeto do tipo Animal
diretamente, ainda podemos usá-lo como parâmetro em uma função. Semelhante ao exemplo anterior do botão, essa abordagem utiliza o polimorfismo para criar um programa versátil que pode alterar seu comportamento dinamicamente em tempo de execução.
Tente passar um objeto de uma class
diferente para a função e observe a saída. Além disso, tente criar um objeto da class
abstrata para ver como o compilador impede a instanciação devido a métodos virtuais puros não implementados.
Obrigado pelo seu feedback!