Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Método Virtual Puro | Visão Geral do Polimorfismo
C++ Poo
course content

Conteúdo do Curso

C++ Poo

C++ Poo

1. Fundamentos de POO em C++
2. Construtores e Destrutores
3. Visão Geral do Encapsulamento
4. Visão Geral de Herança
5. Visão Geral do Polimorfismo

book
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.h

copy
1
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

Animal.h

copy
1234
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

main.cpp

copy
1234567
#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

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#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.

Note
Nota

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.

question mark

O que acontece quando uma classe contém um método virtual puro?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 5. Capítulo 3

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

course content

Conteúdo do Curso

C++ Poo

C++ Poo

1. Fundamentos de POO em C++
2. Construtores e Destrutores
3. Visão Geral do Encapsulamento
4. Visão Geral de Herança
5. Visão Geral do Polimorfismo

book
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.h

copy
1
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

Animal.h

copy
1234
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

main.cpp

copy
1234567
#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

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#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.

Note
Nota

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.

question mark

O que acontece quando uma classe contém um método virtual puro?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 5. Capítulo 3
some-alt