輸入副檔名

如果派生型別既沒有 bind 屬性也沒有 sequence 屬性,則它是可擴充套件的。這種型別可以通過其他型別擴充套件。

module mod

  type base_type
    integer i
  end type base_type

  type, extends(base_type) :: higher_type
    integer j
  end type higher_type

end module mod

宣告型別為 base_type 的多型變數與 higher_type 型別相容,可以將其作為動態型別

class(base_type), allocatable::obj
allocate(obj, source=higher_type(1,2))

型別相容性通過一系列子項下降,但型別可能只擴充套件另一種型別。

擴充套件派生型別從父級繼承型別繫結過程,但可以覆蓋它

module mod

  type base_type
  contains
    procedure::sub => sub_base
  end type base_type

  type, extends(base_type) :: higher_type
  contains
    procedure::sub => sub_higher
  end type higher_type

contains

  subroutine sub_base(this)
    class(base_type) this
  end subroutine sub_base

  subroutine sub_higher(this)
    class(higher_type) this
  end subroutine sub_higher

end module mod

program prog
  use mod

  class(base_type), allocatable::obj

  obj = base_type()
  call obj%sub

  obj = higher_type()
  call obj%sub

end program