Une classe est une construction d'un langage de programmation qui représente un type non paramétré. Les types représentés par des classes ne sont pas mutuellement exclusifs ; en fait les classes forment une arborescence, en réalité un graphe orienté sans cycles (en Anglais : directed acyclic graph) (DAG), le graphe d'héritage.
Une classe (et donc le type correspondant) est créée par spécialisation d'une ou plusieurs classes existantes. Une classe C créée par spécialisation d'une autre classe B (et peut-être d'autres classes aussi) est une sous-classe de B. On dit aussi que C hérite de B, et que C est dérivée de B. La classe B est appelée la classe mère de C. Le graphe d'héritage représente donc la relation de sous-ensemble sur les types.
Un objet est toujours l'instance directe d'une seule classe. Cette classe est la classe de l'objet. Un objet instance directe d'une classe C est aussi instance (indirecte) de toutes les classes ancêtres de C.
L'héritage peut être simple ou multiple selon le langage de programmation. Si l'héritage est simple, une classe peut être dérivée d'au plus une autre classe et le graphe d'héritage est un arbre. De plus, si l'héritage est simple, deux types A et B représentés par des classes sont forcément apparentées de l'une des trois façons suivantes :
En revanche, si l'héritage est multiple, deux classes A et B peuvent avoir des éléments en commun sans que A et B soient apparentées par héritage. Il suffit qu'il existe une classe C qui hérite (même indirectement) à la fois de A et de B. Les éléments de C sont alors communs à A et B.