Na programação orientada a objetos, o polimorfismo (do grego que significa "ter múltiplas formas") é a característica de ser capaz de atribuir um significado ou uso diferente a algo em contextos diferentes - especificamente, para permitir que uma entidade como uma variável, uma função, ou um objeto tenha mais de uma forma. Existem vários tipos diferentes de polimorfismo.
1) Uma variável com um nome dado pode ter diferentes formas e o programa pode determinar qual forma da variável a usar no momento da execução. Por exemplo, uma variável chamada USERID pode ser capaz de ser um número inteiro (número inteiro) ou uma cadeia de caracteres (talvez porque o programador queira permitir que um usuário insira um ID de usuário como um número de funcionário - um número inteiro - ou com um nome - uma cadeia de caracteres). Ao dar ao programa uma forma de distinguir qual a forma que está sendo tratada em cada caso, ambos os tipos podem ser reconhecidos e tratados.
2) Uma função nomeada também pode variar dependendo dos parâmetros que lhe são dados. Por exemplo, se dada uma variável que é um número inteiro, a função escolhida seria procurar uma correspondência contra uma lista de números de empregados; se a variável fosse uma string, ela procuraria uma correspondência contra uma lista de nomes. Em ambos os casos, ambas as funções seriam conhecidas no programa com o mesmo nome. Este tipo de polimorfismo é às vezes conhecido como overloading.
Em C++, por exemplo, o operador conhecido como o sinal de mais (+) - que é efetivamente uma simples função nomeada - pode ser atribuído para operar em dois objetos de tal forma que os adiciona juntos (talvez a forma mais comum da operação +) ou, como na busca booleana, um + pode indicar um "e" lógico (significando que ambas as palavras separadas pelo operador + devem estar presentes para que uma citação seja retornada). Em outro contexto, o sinal + pode significar uma operação para concatenar os dois objetos ou cadeias de letras em cada lado do sinal +.
Um operador dado também pode receber outro significado quando combinado com outro operador. Por exemplo, na linguagem C++, um "++" seguindo uma variável pode significar "incrementar este valor em 1". O significado de um determinado operador é definido como parte de uma definição de classe. Como o programador pode criar classes, o programador também pode definir como os operadores trabalham para esta classe de objetos; na verdade, o programador pode redefinir a linguagem de computação.
3) Polimorfismo pode significar, como na linguagem ML, um tipo de dado "qualquer", de tal forma que quando especificado para uma lista, uma lista contendo qualquer tipo de dado pode ser processada por uma função. (Por exemplo, se uma função simplesmente determina o comprimento de uma lista, não importa que tipos de dados estão na lista.)
4) Em PHP, polimorfismo significa que se B é descendente de A e uma função pode aceitar A como parâmetro, ele também pode aceitar B.