| ! File : runme.f90 | 
 | program runme | 
 |   use ISO_FORTRAN_ENV | 
 |   implicit none | 
 |   integer, parameter :: STDOUT = OUTPUT_UNIT | 
 |  | 
 |   call run() | 
 | contains | 
 |  | 
 | subroutine run() | 
 |   use example | 
 |   use iso_c_binding | 
 |   implicit none | 
 |  | 
 |   type(Circle)          :: c | 
 |   type(Square), target  :: s ! 'target' allows it to be pointed to | 
 |   class(Shape), pointer :: sh | 
 |   integer(C_INT) :: n_shapes | 
 |  | 
 |   ! ----- Object creation ----- | 
 |  | 
 |   write(STDOUT,*) "Creating some objects" | 
 |   c = Circle(10.0d0) | 
 |   s = Square(10.0d0) | 
 |  | 
 |   ! ----- Access a static member ----- | 
 |   write(STDOUT,'(a,i2,a)')"A total of", s%get_nshapes(), " shapes were created" | 
 |  | 
 |   ! ----- Member data access ----- | 
 |  | 
 |   ! Notice how we can do this using functions specific to | 
 |   ! the 'Circle' class. | 
 |   call c%set_x(20.0d0) | 
 |   call c%set_y(30.0d0) | 
 |  | 
 |   ! Now use the same functions in the base class | 
 |   sh => s | 
 |   call sh%set_x(-10.0d0) | 
 |   call sh%set_y(  5.0d0) | 
 |  | 
 |   write(STDOUT,*)"Here is their current position:" | 
 |   write(STDOUT,'(a,f5.1,a,f5.1,a)')"  Circle = (", c%get_x(), ",", c%get_y(), " )" | 
 |   write(STDOUT,'(a,f5.1,a,f5.1,a)')"  Square = (", s%get_x(), ",", s%get_y(), " )" | 
 |  | 
 |   ! ----- Call some methods ----- | 
 |  | 
 |   write(STDOUT,*)"Here are some properties of the shapes:" | 
 |   call print_shape(c) | 
 |   call print_shape(s) | 
 |  | 
 |   ! ----- Delete everything ----- | 
 |  | 
 |   ! Note: this invokes the virtual destructor | 
 |   call c%release() | 
 |   call s%release() | 
 |  | 
 |   n_shapes = c%get_nshapes() | 
 |   write(STDOUT,*) n_shapes, "shapes remain" | 
 |   if (n_shapes /= 0) then | 
 |     write(STDOUT,*) "Shapes were not freed properly!" | 
 |     stop 1 | 
 |   endif | 
 |  | 
 |   write(STDOUT,*) "Goodbye" | 
 | end subroutine | 
 |  | 
 | subroutine print_shape(s) | 
 |   use example, only : Shape | 
 |   use iso_c_binding | 
 |   implicit none | 
 |   class(Shape), intent(in) :: s | 
 |  | 
 |   write(STDOUT,*)"    area      = ",s%area() | 
 |   write(STDOUT,*)"    perimeter = ",s%perimeter() | 
 | end subroutine | 
 |  | 
 | end program |