Q. Passing an extended udt with a non extended parameter

General FreeBASIC programming questions.
Post Reply
SamL
Posts: 58
Joined: Nov 23, 2019 17:30
Location: Minnesota

Q. Passing an extended udt with a non extended parameter

Post by SamL »

Is this a safe way to use an extended UDT or should this be avoided?

Code: Select all

type udt_1
    as ulong a
end type
type udt_extended extends udt_1
as ulong b
end type

sub s( byref udt as udt_1) 'will be passing extended udt to this sub
    print sizeof(udt)
    udt.a = 1000
end sub

dim etxended_udt as udt_extended
etxended_udt.b = 2000
etxended_udt.b = 2000

print sizeof(etxended_udt) 'print the size of extended udt
s(etxended_udt)'print non extended udt while passing extending udt.
print
print etxended_udt.a
print etxended_udt.b

sleep
SamL
fxm
Moderator
Posts: 12107
Joined: Apr 22, 2009 12:46
Location: Paris suburbs, FRANCE

Re: Q. Passing an extended udt with a non extended parameter

Post by fxm »

Since 'udt_extended extends udt_1', any 'udt_extended' object is also a 'udt_1' object.
Therefore you can pass a 'udt_extended' object as argument to a procedure declared with a 'udt_1' type parameter, but you will only have directly access to the 'udt_1' members on this object inside the procedure body.
This is called the upcasting.
SamL
Posts: 58
Joined: Nov 23, 2019 17:30
Location: Minnesota

Re: Q. Passing an extended udt with a non extended parameter

Post by SamL »

Thanks!!! This will work great for my code.
SamL
fxm
Moderator
Posts: 12107
Joined: Apr 22, 2009 12:46
Location: Paris suburbs, FRANCE

Re: Q. Passing an extended udt with a non extended parameter

Post by fxm »

If inside the procedure you want to know if the argument passed through a 'udt_1' type parameter is in fact of 'udt_extended' run-type, you must check the real type of the object pointed by the reference ('udt') of 'udt_1' type, thanks to the RTTI (Run Time Type Identification) feature.
For this, the base-type ('udt_1') must extend 'object'.

Example:

Code: Select all

type udt_1 extends object
    as ulong a
end type
type udt_extended extends udt_1
as ulong b
end type

sub s( byref udt as udt_1)
    print sizeof(udt), 
    udt.a = 1000
    if udt is udt_extended then
        print "'udt_extended' run-time type"
        cptr(udt_extended ptr, @udt)->b = 2000  '' downcasting of the udt pointer is licit here
    else
        print "'udt_1' run-time type"
    End If
end sub

dim udt1 as udt_1
s(udt1)
print udt1.a

print

dim etxended_udt as udt_extended
s(etxended_udt)
print etxended_udt.a
print etxended_udt.b

sleep
SamL
Posts: 58
Joined: Nov 23, 2019 17:30
Location: Minnesota

Re: Q. Passing an extended udt with a non extended parameter

Post by SamL »

Ok interesting. I see what going on there with upcasting and downcasting. I also found more info in the manual under "Operator Is (Run-Time Type Information)"

Thanks,
SamL
Post Reply