O que é polimorfismo?
Em programação, polimorfismo é a capacidade de um mesmo trecho de código, como uma chamada de função ou o nome de um método, funcionar com valores de tipos diferentes, com cada tipo fornecendo o próprio comportamento. Chamar shape.area() executa um cálculo diferente para um círculo e para um quadrado.
Atualizado em 24 de setembro de 2026
Em Python, len("hello") devolve 5, len([4, 8, 15]) devolve 3 e len({"a": 1}) devolve 1. É um único nome de função usado com três tipos, e cada tipo conta do seu jeito: uma string conta caracteres, uma lista conta itens, um dicionário conta chaves. A palavra vem do grego: poly, muitos, e morph, forma. Uma chamada, muitas formas de comportamento.
Como o polimorfismo funciona
O código chama um método pelo nome, como shape.area(). Quando essa linha executa, a linguagem olha o objeto real e encontra area na própria classe do objeto. Essa busca se chama despacho dinâmico (dynamic dispatch), e é ela que permite que uma única linha faça um trabalho diferente para objetos diferentes:
Circle 3.14
Square 9
Circle 12.57
O Python encontra o método procurando primeiro na classe do objeto e depois nas classes pai, em uma ordem fixa chamada ordem de resolução de métodos (MRO). Se Square não tivesse o próprio area(), a busca chegaria a Shape.area() e lançaria NotImplementedError, um sinal de que toda subclasse precisa fornecer o seu.
O loop nunca verifica que tipo de forma ele tem. Para acrescentar um triângulo, você escreve uma classe Triangle com o próprio area(), e o loop funciona sem mudanças. Sem polimorfismo, o loop precisaria de um ramo if isinstance(...) para cada forma, editado toda vez que surgisse uma nova.
Tipos de polimorfismo
| Tipo | Também chamado | Como aparece | Quando a versão é escolhida |
|---|---|---|---|
| De subtipo | Polimorfismo em tempo de execução, sobrescrita de métodos | Uma subclasse substitui um método do pai | Enquanto o programa executa |
| Ad hoc | Sobrecarga | Um nome, várias versões para tipos de parâmetro diferentes; também sobrecarga de operadores | Em tempo de compilação em Java e C++ |
| Paramétrico | Genéricos, templates | Um trecho de código que funciona para qualquer tipo: List<T> em Java, vector<T> em C++ | Em tempo de compilação |
Quando as pessoas dizem "polimorfismo" em programação orientada a objetos sem mais detalhes, quase sempre querem dizer a primeira linha: polimorfismo de subtipo por meio de sobrescrita.
O Python tem os três, do seu jeito. A sobrescrita funciona como no exemplo das formas. Operadores como + são polimorfismo ad hoc. Funções como max() e sorted() são paramétricas no espírito: aceitam uma lista de números, strings ou datas, desde que os itens possam ser comparados, e anotações de tipo como list[int] ou um TypeVar podem deixar isso explícito.
Polimorfismo em tempo de compilação e em tempo de execução em Java
O Java tem os dois tipos, e perguntas de entrevista costumam pedir a diferença:
class Animal { String sound() { return "..."; } }
class Dog extends Animal {
@Override String sound() { return "Woof"; }
}
Animal pet = new Dog();
pet.sound(); // "Woof": chosen at run time from the object
int add(int a, int b) { return a + b; }
double add(double a, double b) { return a + b; }
add(2, 3); // int version, chosen by the compiler
add(2.5, 1.0); // double version
A variável pet tem o tipo Animal, mas é a versão de Dog que executa, porque a escolha depende do objeto, não da variável. Os dois métodos add são sobrecarga: o compilador escolhe um pelos tipos dos argumentos antes de o programa executar. As interfaces dão o mesmo comportamento em tempo de execução sem compartilhar código: qualquer classe que implementa Comparable pode ser ordenada por Collections.sort. O C++ funciona do mesmo jeito, com uma diferença: um método só tem despacho em tempo de execução se for declarado virtual. Veja polimorfismo em Java, sobrecarga de métodos e funções virtuais em C++.
Polimorfismo em Python: duck typing e operadores
O Python não exige uma classe pai em comum. Se um objeto tem o método que o código chama, funciona: "se anda como um pato e grasna como um pato, é um pato". Os operadores também são polimórficos. Escrever a + b chama a.__add__(b), então as suas próprias classes podem suportar +, len() e print():
3 abcd [1, 2]
Vector(11, 22)
5 3 2
A herança é uma forma de obter polimorfismo, não um requisito. Vector não herda de nada especial, mas len() e + o tratam como um tipo nativo. A documentação de herança em Python mostra o caminho das subclasses.
Erros comuns
Esperar que o Python faça sobrecarga pela assinatura. Um segundo def com o mesmo nome substitui o primeiro em silêncio:
Hi Ana Silva
Traceback (most recent call last):
...
TypeError: greet() missing 1 required positional argument: 'last'
Use um argumento padrão no lugar: def greet(first, last="").
Esquecer o virtual em C++. Sem ele, chamar um método por um ponteiro para a classe base executa a versão da base, mesmo quando o objeto é de uma subclasse.
Sobrescritas que mudam o significado. Se area() em uma subclasse devolve o perímetro, todo código que confia em area() quebra. Uma sobrescrita precisa cumprir a promessa que o pai fez; essa regra é conhecida como princípio da substituição de Liskov.
Verificações de tipo por toda parte. Uma cadeia de ramos if type(x) == ... costuma ser sinal de que cada tipo deveria ter o próprio método.
Próximos passos
O polimorfismo trabalha junto com o encapsulamento, que protege os dados de cada objeto, e com a abstração, que define a interface comum que os tipos implementam. Pratique a sobrescrita na documentação de classes em Python, ou experimente o curso de Java, onde sobrecarga e sobrescrita aparecem lado a lado.
Perguntas frequentes
Qual é um exemplo de polimorfismo?
+ em Python: 1 + 2 soma números, "ab" + "cd" junta strings e [1] + [2] junta listas. O mesmo símbolo funciona com três tipos, e cada tipo decide o que ele significa. Em código orientado a objetos, o exemplo clássico é uma lista de formas em que cada uma responde a area() com a própria fórmula.Qual é a diferença entre polimorfismo e herança?
O que é polimorfismo na biologia?
O Python tem sobrecarga de métodos?
def com o mesmo nome substitui o primeiro. O código Python obtém o mesmo efeito com argumentos padrão, *args ou functools.singledispatch, que escolhe uma função com base no tipo do primeiro argumento.Para que serve o polimorfismo?
shape.draw() em cada forma não precisa de nenhuma edição quando você acrescenta uma classe de triângulo; só a classe nova é escrita. Sem polimorfismo, esse loop ganharia um novo ramo if para cada tipo.