Os dois códigos abaixo implementam duas classes com herança e polimorfismo. A única diferença entre eles está na linha 07.
Como essa diferença impacta o uso de ponteiros? Escreva um código que mostre essa diferença.
Passo 1
Vamos nessa!
A única diferença entre os dois códigos é que na linha 06 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.
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
Primeiro vamos executar o Código A que utiliza o
Então vamos fazer o seguinte. Dentro da vamos declarar um ponteiro para classe chamdo , e um objeto da classe chamado .
Em seguida, vamos guardar o endereço de no ponteiro
E pra terminar vamos executar o método duas vezes. A primeira vez vamos executar através do ponteiro, e a segunda vez vamos executar através do objeto.
Usando o os resultados são iguais! Nos dois casos a versão “polimorfada” é executada. Isso acontece pois o informa ao C++ que o método pode sofrer polimorfismo, então quando usamos um ponteiro da classe mãe para apontar para a classe filha o C++ está ciente que deve buscar por um polimorfismo do método .
Passo 3
E agora vamos executar o Código B que não utiliza o
Quando não usamos o os resultados são diferentes! A chamada através de ponteiro executa a versão da classe mãe, e a chamada através de objeto executa a versão “polimorfada” da classe filha.
Isso acontece pois, sem o , não existe nenhum aviso da possibilidade de polimorfismo, então, o C++ não se preocupa em conferir se existe polimorfismo do método , e simplesmente executa a versão da classe mãe.
Já quando utilizamos diretamente o objeto da classe filha, nós conseguimos executar a versão com polimorfismo, pois estamos fazendo uma chamada direta a esse objeto, enquanto o ponteiro faz uma chamada indireta.
Resposta
Quando o não está presente, ao executar uma chamada de um objeto da classe filha através de ponteiro da classe mãe, a versão com polimorfismo será ignorada, e a versão da classe mãe será executada.