3.9 多重継承

多重継承をすることもできます。同じメソッドの定義の内、最後のものだけが有効です。もし子クラスで参照可能な親クラスのメソッドが子クラスで再び定義された場合、メソッドは子クラスのものに上書きされます。しかし、親クラスの定義も、親クラスを識別子に束縛することにより用いることができます。次の例では、super が親クラスである printable_point に束縛されています。 super は疑似的な変数名で、 super#print のように親クラスのメソッドを呼び出すためにのみ用いることができます。

#class printable_colored_point y c = 
   object (self)
     val c = c
     method color = c
     inherit printable_point y as super
     method print =
       print_string "(";
       super print;
       print_string ", ";
       print_string (self color);
       print_string ")"
   end;;
class printable_colored_point :
  int ->
  string ->
  object
    val c : string
    val mutable x : int
    method color : string
    method get_x : int
    method move : int -> unit
    method print : unit
  end

#let p' = new printable_colored_point 17 "red";;
new point at (10, red)
val p' : printable_colored_point = <obj>

#p'#print;;
(10, red)- : unit = ()
    

親クラスのプライベートメソッドで、子クラスから隠蔽されているものは継承によって上書きされません。初期化子はプライベートメソッドと見なされるので、子クラスに至るクラス階層で定義されたすべての初期化子は、それが導入された順に評価されます。