Exercícios Resolvidos de Polimorfismo

Ver Teoria

Enunciado

Os dois códigos abaixo implementam duas classes com herança e polimorfismo. A única diferença entre eles está na linha 07.

Qual o impacto dessa diferença? Escreva uma m a i n ( ) que demonstre o seu argumento.

Passo 1

Vamos lá, pessoal!

A única diferença entre os dois códigos é que na linha 07 o Código A utiliza a palavra chave v i r t u a l e o código B não utiliza

Isso quer dizer que no código A o método T e x t o (   ) é um método virtual, e no código B não.

Os métodos virtuais são uma forma de mudar o comportamento de um método que vai sofrer polimorfismo.

A mudança de comportamento acontece quando existe iterações entre a classe mãe e a classe filha de uma das duas formas:

  1. Quando um método que sofreu polimorfismo na classe filha é executando dentro de outro método da classe mãe.
  2. Quando usamos ponteiros da classe mãe para armazenar o endereço de um objeto da classe filha.

O v i r t u a l informa ao C++ que ele sempre deve olhar pra classe filha em busca de polimorfismos. Caso o virtual não esteja presente, quando a gente executar um dos dois casos acima, a versão “polimorfada” será ignorada, e a versão da classe mãe será executada.

Você pode ver que o Caso 2 acontece nos códigos do enunciado. O método T e x t o (   ) é executando dentro do método P r i n t (   ) da classe mãe, e ao mesmo tempo sofre polimorfismo dentro da classe filha. Quando o v i r t u a l não é utilizado, os métodos da classe mãe vão executar chamadas para métodos existentes na classe mãe.

De certa forma é como se quando a gente não usa o v i r t u a l o polimorfismo só tem validade dentro da classe Filha, e métodos e ponteiro da classe mãe não vão levar o polimorfismo em conta.

Para ficar mais claro. Vamos executar os códigos A e B

Passo 2

Agora vamos ver um exemplo do código A em ação.

Vamos criar um objeto da classe filha e executar os métodos T e x t o e P r i n t

Quando o objeto executa o método T e x t o ele sempre executa versão com polimorfismo, pois estamos fazendo uma chamada direta ao método.

Quando executamos o método P r i n t estamos executando um método herdado. Esse método herdado vai executar o método T e x t o , porém o método T e x t o é virtual, e logo, a o P r i n t sabe que deve conferir se o método T e x t o sofreu polimorfismo.

Passo 3

Agora vamos ver como o código B se comporta.

Vamos criar um objeto da classe filha e executar os métodos T e x t o e P r i n t

Quando o objeto executa o método T e x t o ele sempre executa versão com polimorfismo, pois estamos fazendo uma chamada direta ao método.

Quando executamos o método P r i n t estamos executando um método herdado. Esse método herdado vai executar o método T e x t o , porém o método T e x t o é não virtual, e logo, a o P r i n t simplesmente executa a versão existente na classe mãe.

Resposta

A ausência da palavra-chave v i r t u a l modifica o comportamento dos métodos da classe mãe que fazem chamadas ao método T e x t o