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 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 e o código B não utiliza
Isso quer dizer que no código A o método é 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:
- Quando um método que sofreu polimorfismo na classe filha é executando dentro de outro método da classe mãe.
- Quando usamos ponteiros da classe mãe para armazenar o endereço de um objeto da classe filha.
O 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 é executando dentro do método da classe mãe, e ao mesmo tempo sofre polimorfismo dentro da classe filha. Quando o 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 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 e
Quando o objeto executa o método ele sempre executa versão com polimorfismo, pois estamos fazendo uma chamada direta ao método.
Quando executamos o método estamos executando um método herdado. Esse método herdado vai executar o método , porém o método é virtual, e logo, a o sabe que deve conferir se o método 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 e
Quando o objeto executa o método ele sempre executa versão com polimorfismo, pois estamos fazendo uma chamada direta ao método.
Quando executamos o método estamos executando um método herdado. Esse método herdado vai executar o método , porém o método é não virtual, e logo, a o simplesmente executa a versão existente na classe mãe.
Resposta
A ausência da palavra-chave modifica o comportamento dos métodos da classe mãe que fazem chamadas ao método