如何使用 parent type-bound 过程使 type-bound 多态指针指向扩展类型?

How to make a type-bound polymorphic pointer point to an extended type, using a parent type-bound procedure?

我不确定我写的问题标题是否正确,但我做了一个 MWE 来更好地解释我想做什么:

module prueba

type    :: basic
  class(basic),pointer  :: myself => null()
  contains
  procedure :: hello => basic_hello
end type
 
type,extends(basic)    :: complicated
  contains
  procedure :: hello => complicated_hello
end type

contains

subroutine basic_hello(a)
class(basic), target  :: a
a%myself=>a       ! <----- XXX
print *, 'I am basic'
end subroutine
 
subroutine complicated_hello(a)
class(complicated), target  :: a
call a%basic%hello()
print *, 'I am complicated'
end subroutine
            
end module

program main
use prueba
type(complicated)    :: a

call a%hello()
! Returns:  
! I am basic
! I am complicated
  
call a%myself%hello()
! Returns:
! I am basic

end program 

我想在基本级别设置指针 a%myself,使其成为多态的,这样我就可以 运行 任何扩展的 hello 过程。也就是说,我还想在第二次调用中(通过指针)获得“我很复杂”的图例。这在 MWE 中可能没有意义,但我认为它在我的真实代码中确实如此。由于这种方法不起作用,我想知道为什么,以及其他可能的替代方法。谢谢。

主要原因在

call a%basic%hello()

这样你传递的引用实际上是 type(basic),因此我自己中存储的指针只是指向 type(basic).

的那个部分的指针

你需要做作业

a%myself=>a  

在某些上下文中,a 实际上是动态类型 complicated 即使是多态的 class(basic)

这可能在外部范围内,您可以在其中访问原始 type(complicated) 变量,或者您可以,例如,执行

call basic_hello(a) 

而不是 call a%basic%hello()

这传递了作为 complicated_hello(a) 参数的 a 而不是 a%basic