如何通过父类类型绑定过程让多态指针指向扩展类型实例
问题原因
你代码的核心问题出在父类过程的调用方式:你在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
相关产品推荐
相关产品推荐

