You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过父类类型绑定过程让多态指针指向扩展类型实例

问题原因

你代码的核心问题出在父类过程的调用方式:你在complicated_hello中用call a%basic%hello()调用父类方法时,传入basic_hello的参数是父类的静态类型组件basic,而非完整的多态complicated对象。
此时basic_hello中的虚参a动态类型就是basic,你执行a%myself=>a时,myself指针的动态类型也被设置为basic,后续调用自然只会触发父类的hello方法,无法实现多态分发。

可行解决方案

方案1:直接调用父类过程而非通过父类组件调用

修改complicated_hello的实现,直接调用父类的basic_hello子程序,传入完整的多态对象即可保留动态类型:

subroutine complicated_hello(a)
class(complicated), target  :: a
! 替换原有调用方式,直接传入完整多态对象
call basic_hello(a)
print *, 'I am complicated'
end subroutine

修改后调用a%myself%hello()会正确触发多态,输出I am complicated。

方案2:新增通用的指针设置过程

如果不想在子类中直接调用父类的子程序,可以在父类中新增通用的指针赋值方法,兼容所有扩展类型:

type    :: basic
  class(basic),pointer  :: myself => null()
  contains
  procedure :: hello => basic_hello
  procedure :: set_myself ! 新增通用赋值方法
end type

contains
subroutine set_myself(this, target_obj)
class(basic) :: this
class(basic), target :: target_obj
  this%myself => target_obj
end subroutine

! 对应的basic_hello修改为:
subroutine basic_hello(a)
class(basic), target  :: a
call a%set_myself(a)
print *, 'I am basic'
end subroutine

后续所有扩展类型调用hello时都会正确保留动态类型。

方案3:初始化阶段设置指针

如果你的对象创建后不会变更类型,可以在对象初始化的阶段统一设置myself指针,避免在业务方法中重复赋值出现类型截断问题。


内容的提问来源于stack exchange,提问作者alexis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:27:02