Polimorfismo é a capacidade de qualquer dado ser processado em mais de uma forma. A própria palavra indica o significado como polymeio muitos e morphismmeios tipos . O polimorfismo é um dos conceitos mais importantes da linguagem de programação orientada a objetos. O uso mais comum de polimorfismo na programação orientada a objetos ocorre quando uma referência de classe pai é usada para se referir a um objeto de classe filho. Aqui veremos como representar qualquer função em muitos tipos e muitas formas.
Exemplo da vida real de polimorfismo, uma pessoa ao mesmo tempo pode ter diferentes papéis a desempenhar na vida. Como uma mulher ao mesmo tempo é mãe, esposa, empregada e filha. Portanto, a mesma pessoa deve ter muitos recursos, mas deve implementar cada um de acordo com a situação e a condição. O polimorfismo é considerado uma das características importantes da Programação Orientada a Objetos.

O polimorfismo é o principal poder da programação orientada a objetos. É muito importante que linguagens que não suportam polimorfismo não possam se anunciar como linguagens orientadas a objetos. As linguagens que possuem classes, mas não têm capacidade de polimorfismo, são chamadas de linguagens baseadas em objetos. Portanto, é muito vital para uma linguagem de programação orientada a objetos.
É a capacidade de um objeto ou referência assumir muitas formas em diferentes instâncias. Ele implementa o conceito de sobrecarga de função, sobreposição de função e funções virtuais.

O polimorfismo é uma propriedade por meio da qual qualquer mensagem pode ser enviada a objetos de várias classes, e todo objeto tem a tendência de responder de maneira apropriada dependendo das propriedades da classe.

Isso significa que o polimorfismo é o método em uma linguagem de programação orientada a objetos que faz coisas diferentes dependendo da classe do objeto que o chama. Por exemplo, $square-> area() retornará a área de um quadrado, mas $triangle-> area() pode retornar a área de um triângulo. Por outro lado, $object-> area() teria que calcular a área de acordo com a qual a classe $object foi chamada.

O polimorfismo pode ser melhor explicado com a ajuda do seguinte exemplo:

use warnings;
  
# Creating class using package
package A;
  
# Constructor creation
sub new
{
   
    # shift will take package name 'vehicle' 
    # and assign it to variable 'class'
    my $class = shift;
    my $self = {
                  'name' => shift,
                  'roll_no' => shift
               };
      
    sub poly_example
    {
      print("This corresponds to class A\n");
    }
};
  
package B;
  
# The @ISA array contains a list 
# of that class's parent classes, if any
my @ISA = (A);
  
sub poly_example
{
  print("This corresponds to class B\n");
  
}
  
package main;
  
B->poly_example();
A->poly_example();

Saída:

Para a primeira saída, o método poly_example() definido na classe B substitui a definição que foi herdada da classe A e vice-versa para a segunda saída. Isso permite adicionar ou estender a funcionalidade de qualquer pacote pré-existente sem reescrever toda a definição de toda a classe novamente e novamente. Facilitando assim para o programador.