fortran - 指向父类的多态指针不起作用

标签 fortran polymorphism fortran2008

考虑以下类结构,它涉及三个独立的模块:

!------------------------在文件a.f中

  module parent_body_mod
  type :: face
     class(parent_body), pointer :: bPtr
  end type
  type, abstract :: parent_body
     integer i
     type(face) :: f
  end type
  end module parent_body_mod

!------------------------ 在文件 b.f

  module body_mod
  use parent_body_mod

  type, extends(parent_body) :: body
  end type

  interface body
     procedure :: new_body
  end interface

  contains

  function new_body() result(b) 
  type(body), target :: b
  b%i = 123
  b%f%bPtr => b
  end function
  end module body_mod

!---------------------------- 在文件 c.f

  module body_group_mod
  use body_mod
  type :: body_group
     type(body), allocatable :: b
  end type
  interface body_group
     procedure :: new_body_group
  end interface
  contains 
  function new_body_group() result(bg)
  type(body_group) :: bg

  allocate(bg%b)
  bg%b = body()

  end function
  end module body_group_mod

!--------------------主程序

  use body_group_mod

  type(body_group) :: my_bg

  my_bg = body_group()      

  print *, my_bg%b%f%bPtr%i

  end

! --------------------------------------------------

预期输出是 123,而实际输出是随机的。该代码使用 ifort 版本 18.0.1 编译。请注意,使用“body”类本身时不会发生同样的问题,即以下工作正常:

type(body), allocatable :: my_b

allocate(my_b)

my_b = body()

print *, my_b%f%bPtr%i ! This produces 123 as expected.

感谢任何帮助。

最佳答案

代码不合格。

当过程执行完成时,与过程中未保存的局部变量关联的指针将变为未定义 (F2008 16.5.2.5 (5))。函数结果 b在功能new_body被认为是这样的局部变量(F2008 1.3.154.1),因此指针组件 b%f%bPtr函数调用后变为未定义。

与其他本地未保存的变量相比,函数结果有点特殊,因为它们的值的可用时间比变量存在的时间长 - 请参阅 F2008 注释 12.41 进行一些讨论。

思考问题的另一种方式是使用语句 bg%b = body() ,左侧的主体与右侧的主体是不同的对象。赋值只是复制右侧对象的值 - 一旦赋值完成,右侧对象将不再存在。没有任何代码表明当主体对象的值被传输时 - 指针组件需要更新以引用被分配的左侧变量。另请注意左侧bg%b没有 TARGET 属性 - 因此无论如何指针都无法与其有效关联。

关于fortran - 指向父类的多态指针不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51216143/

相关文章:

c++ - 与 gcc、g++ 和 gfortran 链接

oop - fortran 2003 中的运行时多态性

c++ - 指向抽象模板基类的指针?

linux - 采购 `compilervars.sh intel64` 时 libtbb.so.2 库不存在

Fortran 中的随机数

c# - 当成员字段是对象的集合并且也是继承树的一部分时,成员字段中的多态性

arrays - Fortran 2008 - 类中的数组变量

fortran - Fortran 2008 中的函数重载

c++ - 将 char 转换为 std::string,然后连接