多态主要分为三类:C.斯特雷奇(Christopher Strachey)于1967年引入的特设多态(ad hoc polymorphism)与参数多态(parametric polymorphism),以及Luca Cardelli与Peter Wegner于1985年引入的子类型多态(subtype polymorphism)。子类型多态又称包含多态(inclusion polymorphism)。
特设多态指一个多态函数具有多个不同实现,针对调用时传入的不同类型(甚至不同数量)的参数而调用相应版本的实现,进而呈现出不同行为。支持函数重载或运算符重载的语言(如C++、Ruby)可视为具有特设多态的特性。
参数多态指定义函数时,对于其部分(或全部)变量可不指定具体类型,而是使用类型参数表示其类型,定义出的多态函数可适用于各种具体类型。许多语言(如C++、Haskell)所支持的泛型编程就是一种参数多态特性。参数多态允许开发者定义出具备通用性的函数,可以以统一的方式处理数据而不用依赖其具体类型,提升了程序设计语言的表达力与代码复用的能力。
子类型多态指一个父类的多个子类覆写了其同一接口,因而这些子类的对象对于该接口的调用具有不同的响应行为。主流面向对象语言(如Java、C#)均支持子类型多态。