- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I would like to call a base version of an overridden type-bound procedure.
This can be done by using CALL ext%base%A(....)
However, this also "casts" (I don't know the proper word in FORTRAN2003) the passed argumentinto the base type.
This has the effect, that, if e.g. the subroutine A in the base calls another type-bound procedure, it actually calls the type-bound procedure of the base rather than the overrided version in extension.
Is there any possiblity to call a overriden subroutine of the base type, but provide the extended type as the passed argument?
See code below for an example. In this case, I would like to have ABase actually call BExtension rather than BBase.
regards,
Thomas
This can be done by using CALL ext%base%A(....)
However, this also "casts" (I don't know the proper word in FORTRAN2003) the passed argumentinto the base type.
This has the effect, that, if e.g. the subroutine A in the base calls another type-bound procedure, it actually calls the type-bound procedure of the base rather than the overrided version in extension.
Is there any possiblity to call a overriden subroutine of the base type, but provide the extended type as the passed argument?
See code below for an example. In this case, I would like to have ABase actually call BExtension rather than BBase.
regards,
Thomas
[fortran] module types
type base
contains
procedure A => ABase
procedure B => BBase
end type
type, extends(base) :: extension
contains
procedure A => AExtension
procedure B => BExtension
end type
contains
subroutine ABase(this)
class (base) :: this
write (*,*) 'Subroutine ABase has been called'
CALL this%B()
end subroutine
subroutine BBase(this)
class (base) :: this
write (*,*) 'Subroutine BBase has been called'
end subroutine
subroutine AExtension(this)
class (extension) :: this
write (*,*) 'Subroutine AExtension has been called'
CALL this%Base%A()
end subroutine
subroutine BExtension(this)
class (extension) :: this
write (*,*) 'Subroutine BExtension has been called'
end subroutine
end module
program TypeBoundOverrides
use types
implicit none
! Variables
type (Extension) :: ext
! Body of TypeBoundOverrides
call ext%A()
end program TypeBoundOverrides
[/fortran]Link Copied
2 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I am not aware of a way you can do this. When you call this%Base%A, the passed argument has the type of Base. Perhaps you could do something with the fact that you can bind a single procedure to more than one type. So you might have a single AProc that serves both Base and Extension.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Steve, thanks for your answer.
After posting, I had found a simple solution myself. As it is possible to bind the same procedures in a type using multiple names, I could just do the following:
[fortran] type base
contains
procedure A => ABase
procedure ABase => ABase
procedure B => BBase
end type
[/fortran]
Then, I can call ext%ABase() if A is overloaded, instead of calling ext%base%A()
The only thing that is not pefect is that you have to alter the base class to do this. However, that's not a real issue for our needs at the moment.
regards,
Thomas
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page