Operator Is (Run-Time Type Information)
Check if an object is compatible to a type derived from its compile-time type
(in the context of inheritance)
Syntax
`
result = expression Is typename
`
Parameters
`expression`
The expression to check, an object of a type that is directly or indirectly derived from `Object` using `Extends`.
`typename`
The child type to check for. This type must be directly or indirectly derived from the type of expression (the compile-time type of the object).
Return Value
Returns negative one (`-1`) if the expression is an object of real-type `typename` or one of its base-types derived from the expression type, or zero (`0`) if it's an object of an incompatible type.
Description
The `Is` operator must be used in conjunction with inheritance in order to check compatibility between objects and types from an inheritance structure extending the built-in `Object` type.
The `Is` operator is a binary operator that checks whether an object is compatible to its derived types at run-time. Because `Is` relies on Run-Time Type Information (RTTI), it can only be used with types that are derived from the built-in `Object` type using `Extends`. The compiler disallows using `Is` for checks that can be solved at compile-time.
The `Is` operator is successful not only for the real-type (the "lowest"), but also for its base-types, as long as they are still below the type of expression (the compile-time type). In order to determine the real-type, all possibilities from lowest to highest must be checked.
Extending the built-in `Object` type allows to add an extra hidden vtable pointer field at the top of the `Type`. The vtable is used to access information for run-time type identification used by the `Is` operator.
This operator cannot be overloaded.
Example
`
Type Vehicle Extends Object
As String Name
End Type
Type Car Extends Vehicle
End Type
Type Cabriolet Extends Car
End Type
Type Bike Extends Vehicle
End Type
Sub identify(ByVal p As Object Ptr)
Print "Identifying:"
'' Not a Vehicle object?
If Not (*p Is Vehicle) Then
Print , "unknown object"
Return
End If
'' The cast is safe, because we know it's a Vehicle object
Print , "name: " & CPtr(Vehicle Ptr, p)->Name
If *p Is Car Then
Print , "It's a car"
End If
If *p Is Cabriolet Then
Print , "It's a cabriolet"
End If
If *p Is Bike Then
Print , "It's a bike"
End If
End Sub
Dim As Car ford
ford.name = "Ford"
identify(@ford)
Dim As Cabriolet porsche
porsche.name = "Porsche"
identify(@porsche)
Dim As Bike mountainbike
mountainbike.name = "Mountain Bike"
identify(@mountainbike)
Dim As Vehicle v
v.name = "some unknown vehicle"
identify(@v)
Dim As Object o
identify(@o)
`
Differences from QB

- New to FreeBASIC

See also

- `Extends`
- `Extends Zstring`
- `Extends Wstring`
- `Object`
- `Is (Select Case)`
- `TypeOf`