2

F2k3には仮想デストラクタがないことを正しく理解していますか?

stefanos-imac:oop borini$ cat a.f90
module AModule
   type :: AType
      contains
      final :: A_dtor
   end type
contains
   subroutine A_dtor(self)
      type(AType), intent(inout) :: self

      print *, "A_dtor"

   end subroutine
end

stefanos-imac:oop borini$ cat b.f90 
module BModule
   use AModule
   type,extends(AType) :: BType
      contains
      final :: B_dtor
   end type
contains
   subroutine B_dtor(self)
      type(BType), intent(inout) :: self

      print *, "B_dtor"

   end subroutine
end

stefanos-imac:oop borini$ cat x.f90 
program x
   use AModule
   use BModule

   class (AType), pointer :: baseptr
   type(BType), pointer :: derivedptr

   allocate(derivedptr)
   baseptr => derivedptr
   deallocate(baseptr)

end program

stefanos-imac:oop borini$ ./a.out 
 A_dtor
forrtl: severe (173): A pointer passed to DEALLOCATE points to an array that cannot be deallocated
Image              PC                Routine            Line        Source             
a.out              0000000108A731F4  Unknown               Unknown  Unknown
a.out              0000000108A7198E  Unknown               Unknown  Unknown
a.out              0000000108A4D791  Unknown               Unknown  Unknown
a.out              0000000108A2283E  Unknown               Unknown  Unknown
a.out              0000000108A3B930  Unknown               Unknown  Unknown
a.out              0000000108A1EF10  Unknown               Unknown  Unknown
a.out              0000000108A0A104  Unknown               Unknown  Unknown
a.out              0000000108A09F0C  Unknown               Unknown  Unknown
a.out              0000000108A09EC4  Unknown               Unknown  Unknown
4

1 に答える 1

4

使用しているC++またはJavaの用語(仮想)についてはよくわかりません。Fortranについて話すときは、Fortranの用語を使用したいと思います。Fortranの用語では、ファイナライズ手順は継承されず、オーバーライドできません。新しいタイプと拡張タイプの両方のファイナライズ手順を実行する必要があります。

私が問題を理解している限り、私はそれをうまくサポートするコンパイラを持っていなくても、あなたのプログラムは正しいようです。私は出力を期待します:

B_dtor
A_dtor

真のFortran2003コンパイラーはまだ存在しないため、Fortran 2003および2008標準が特定のコンパイラーを形成していると仮定しないでください。ただし、それらのいくつかはそのふりをしています。Intel Fortran AFAIKは、Fortran2003に完全に準拠しているとは主張していません。

于 2012-06-14T14:48:14.087 に答える