Grâce au mot-clé virtual, il est possible de déclarer des méthodes de manière abstraite ou virtuelle, c'est-à-dire, sans fournir leur implantation, qu'on pourra donner plus tard dans une sous-classe. La classe qui contient une méthode virtuelle doit être déclarée elle aussi virtuelle, et ne peut être instanciée (aucun objet de cette classe ne peut être crée). Les classes virtuelles sont utiles pour abstraire sous une même classe parente (et donc, sous un même type), plusieurs classes dont l'implantation des méthodes change dans chacune d'entre-elles.
class virtual abstract_point xinit = object(self) val mutable x = xinit method virtual getx : int method get_offset = self#getx - xinit method virtual move : int -> unit end;; class virtual abstract_point : int -> object val mutable x : int method get_offset : int method virtual getx : int method virtual move : int -> unit end # let ap = new abstract_point 2;; One cannot create instances of the virtual class abstract_point
Dans la classe point on hérite de abstrac_point, et l'on définit enfin le code des deux méthodes abstraites get et move. La nouvelle classe point n'est plus abstraite (si elle n'avait pas défini toutes les méthodes indéfinies dans abstrait_point, le résultaut aurait été une classe point abstraite).
class point xinit = object inherit abstract_point xinit method getx = x method move d = x <- x + d end;; class point : int -> object val mutable x : int method get_offset : int method getx : int method move : int -> unit end # let p = new point 2;; val p : point = <obj> # p#getx;; - : int = 2 # p#get_offset;; - : int = 0