Menu
Coddy logo textTech

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.

Por Kevin Spektor, Cofundador e CTO

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

TipoTambém chamadoComo apareceQuando a versão é escolhida
De subtipoPolimorfismo em tempo de execução, sobrescrita de métodosUma subclasse substitui um método do paiEnquanto o programa executa
Ad hocSobrecargaUm nome, várias versões para tipos de parâmetro diferentes; também sobrecarga de operadoresEm tempo de compilação em Java e C++
ParamétricoGenéricos, templatesUm 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?
O operador + 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?
A herança permite que uma classe reutilize o código de uma classe pai. O polimorfismo permite que o código trate tipos diferentes por meio de uma interface comum. A herança é uma forma comum de obter polimorfismo, porque uma subclasse pode sobrescrever um método do pai, mas o duck typing do Python e as interfaces do Java dão polimorfismo sem compartilhar código nenhum.
O que é polimorfismo na biologia?
Na biologia, polimorfismo significa que duas ou mais formas de uma característica ou de um gene existem na mesma população, como os tipos sanguíneos A, B, AB e O nos seres humanos. Ele tem a mesma raiz grega, "muitas formas", do termo de programação, mas os dois conceitos não têm relação.
O Python tem sobrecarga de métodos?
Não por tipos ou quantidade de parâmetros, como Java e C++ fazem. Um segundo 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?
Ele permite acrescentar novos tipos sem mudar o código que os usa. Um programa de desenho que chama 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.
Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR