Gabarito disponível
#include <iostream>
class Animal {
public:
virtual void falar() = 0;
virtual ~Animal() = default;
};
class Gato final : public Animal {
public:
void falar(){
std::cout << "Miau\n";
}
};
class Cao final : public Animal {
public:
void falar(){
std::cout << "Auau\n";
}
};
int main(){
Animal *a;
a = new Gato;
a->falar();
delete a;
a = new Cao;
a->falar();
delete a;
}
Na programação orientada a objetos, a capacidade de a classe Animal se comportar de forma diferente em cada uma das invocações do método falar(), é chamada de:
Resolução comentada
Mesma chamada a falar() produz comportamentos diferentes conforme o tipo real do objeto: polimorfismo.
Animal tem o método virtual puro falar(), e o ponteiro Animal* aponta primeiro para um Gato e depois para um Cao. A mesma chamada a->falar() executa implementações diferentes (Miau/Auau), escolhidas em tempo de execução pela ligação dinâmica. Isso é polimorfismo.
Análise das alternativas
A) Encapsulamento é ocultar dados e implementação, e não está em jogo aqui. B) Sobrecarga é o mesmo nome com assinaturas diferentes, o que não ocorre. C) Abstração é modelar o essencial; a classe abstrata a viabiliza, mas o comportamento variável é o polimorfismo. E) Herança é o mecanismo de reuso que permite o polimorfismo, não o comportamento descrito.
Referência: Programação orientada a objetos: polimorfismo por subtipo e funções virtuais em C++.
Resolução comentada do VaiConcursos.