fbc: FreeBASIC Compiler - Version 1.05.0
But it works on your original challenge:
Code: Select all
#macro dynamic_cast (typename, expression)
' macro to simulate a 'dynamic cast' operator:
' - 'typename' and 'expression' must be directly or indirectly derived from 'Object' using 'Extends',
' but not necessarily on the same inheritance branch
' - A 'typename' reference is always provided:
' - a non 'null' reference (referring to 'expression') if 'expression' is compatible to 'typename',
' - a 'null' reference (referring to nothing) otherwise.
'-------------------------------------- zone beginning for insertion of one line ---------------------------------------
*cast(typename ptr,cast(object,expression) is typename)
'---------------------------------------- zone ending for insertion of one line ----------------------------------------
#endmacro
#macro family(N) '' for testing purpose, macro to define an inheritance branch structure : family # N
Type Parent##N Extends Object
Declare Operator Cast () As String
End Type
Operator Parent##N.Cast () As String
Operator = "- The instance " & Iif(@This, "'IS-A' ", "'IS-NOT-A'") & " Parent" & #N
End Operator
Type Child##N Extends Parent##N
Declare Operator Cast () As String
End Type
Operator Child##N.Cast () As String
Operator = "- The instance " & Iif(@This, "'IS-A' ", "'IS-NOT-A'") & " Child" & #N
End Operator
Type GrandChild##N Extends Child##N
Declare Operator Cast () As String
End Type
Operator GrandChild##N.Cast () As String
Operator = "- The instance " & Iif(@This, "'IS-A' ", "'IS-NOT-A'") & " GrandChild" & #N
End Operator
#endmacro
family(1) '' define an inheritance branch : family # 1
family(2) '' define an inheritance branch : family # 2
Print "Simple Child1 instance variable:"
Dim As Child1 c1i
Print dynamic_cast(Parent1, c1i)
Print dynamic_cast(Child1, c1i)
Print dynamic_cast(GrandChild1, c1i)
Print dynamic_cast(Parent2, c1i)
Print dynamic_cast(Child2, c1i)
Print dynamic_cast(GrandChild2, c1i)
Print
Print "Dereferenced Parent1 object-type pointer that refers to a Child1 instance:"
Dim As Parent1 Ptr pp1c1i = @c1i
Print dynamic_cast(Parent1, *pp1c1i)
Print dynamic_cast(Child1, *pp1c1i)
Print dynamic_cast(GrandChild1, *pp1c1i)
Print dynamic_cast(Parent2, *pp1c1i)
Print dynamic_cast(Child2, *pp1c1i)
Print dynamic_cast(GrandChild2, *pp1c1i)
Print
Print "Parent1 object-type reference that refers to a Child1 instance:"
Function p1rc1i (Byref c1 As Child1) Byref As Parent1
Return c1
End Function
Print dynamic_cast(Parent1, p1rc1i(c1i))
Print dynamic_cast(Child1, p1rc1i(c1i))
Print dynamic_cast(GrandChild1, p1rc1i(c1i))
Print dynamic_cast(Parent2, p1rc1i(c1i))
Print dynamic_cast(Child2, p1rc1i(c1i))
Print dynamic_cast(GrandChild2, p1rc1i(c1i))
Print
Sleep
0 can be regarded as a pointer with no error.
But so also can -1 (as is the result when cast(object,expression) is actually a typename