如何使用 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
。
我不确定我写的问题标题是否正确,但我做了一个 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
。