継承を説明するため、「点」のクラスから継承によって定義された、「色付きの点」のクラスを定義してみましょう。このクラスは point クラスのすべてのインスタンス変数とメソッドに加えて新しいインスタンス変数である c とメソッドの color を持っています。
#class colored_point x (c : string) = object inherit point x val c = c method color = c end;;class colored_point : int -> string -> object val c : string val mutable x : int method color : string method get_offset : int method get_x : int method move : int -> unit end#let p' = new colored_point 5 "red";;val p' : colored_point = <obj>#p'#get_x, p'#color;;- : int * string = (5, "red")
「点」は color メソッドを持たないので「点」と「色付きの点」は異なった型を持っています。しかし、次の get_x 関数は get メソッドをもつ任意のオブジェクト p に適用することができます。 また p は get 以外のメソッドを持つこともできます。これは get_x の型に含まれる .. によって表されています。ですから、get_x は「点」と「色付きの点」の両方に適用できます。
#let get_succ_x p = p#get_x + 1;;val get_succ_x : < get_x : int; .. > -> int = <fun>#get_succ_x p + get_succ_x p';;- : int = 8
次の例が示すように、メソッドがあらかじめ定義されている必要はありせん。
#let set_x p = p#set_x;;val set_x : < set_x : 'a; .. > -> 'a = <fun>#let incr p = set_x p (get_succ_x p);;val incr : < get_x : int; set_x : int -> 'a; .. > -> 'a = <fun>