FreeBasic Extends Keyword
last modified June 16, 2025
The FreeBasic Extends
keyword enables inheritance in object-oriented
programming. It allows a derived type to inherit members from a base type.
Inheritance promotes code reuse and hierarchical relationships between types.
Basic Definition
In FreeBasic, Extends
creates an inheritance relationship between
types. The derived type inherits all fields and methods from the base type.
The derived type can add new members or override inherited ones.
Inheritance follows an "is-a" relationship. For example, a Dog extends Animal because a dog is an animal. The base type is more general, while derived types are more specific.
Simple Inheritance
This example demonstrates basic inheritance using the Extends keyword.
Type Animal Public: name As String Declare Constructor(name As String) Declare Sub MakeSound() End Type Constructor Animal(name As String) This.name = name End Constructor Sub Animal.MakeSound() Print "Some generic animal sound" End Sub Type Dog Extends Animal Public: Declare Constructor(name As String) Declare Sub MakeSound() End Type Constructor Dog(name As String) Base(name) End Constructor Sub Dog.MakeSound() Print name; " says: Woof!" End Sub Dim d As Dog = Dog("Rex") d.MakeSound()
Here, Dog extends Animal, inheriting its name field. The Dog constructor calls the base constructor using Base(). Dog overrides MakeSound() with its own implementation. This demonstrates polymorphism in action.
Accessing Base Class Members
Derived types can access base class members using the Base keyword.
Type Vehicle Public: speed As Integer Declare Constructor(speed As Integer) Declare Sub Display() End Type Constructor Vehicle(speed As Integer) This.speed = speed End Constructor Sub Vehicle.Display() Print "Speed: "; speed; " km/h" End Sub Type Car Extends Vehicle Public: model As String Declare Constructor(model As String, speed As Integer) Declare Sub Display() End Type Constructor Car(model As String, speed As Integer) Base(speed) This.model = model End Constructor Sub Car.Display() Base.Display() Print "Model: "; model End Sub Dim c As Car = Car("Toyota", 120) c.Display()
The Car type extends Vehicle and adds a model field. Its Display() method calls the base class Display() before adding its own output. Base allows accessing the immediate parent's members.
Multi-level Inheritance
FreeBasic supports multi-level inheritance chains.
Type Person Public: name As String Declare Constructor(name As String) End Type Constructor Person(name As String) This.name = name End Constructor Type Employee Extends Person Public: id As Integer Declare Constructor(name As String, id As Integer) End Type Constructor Employee(name As String, id As Integer) Base(name) This.id = id End Constructor Type Manager Extends Employee Public: department As String Declare Constructor(name As String, id As Integer, department As String) Declare Sub Display() End Type Constructor Manager(name As String, id As Integer, department As String) Base(name, id) This.department = department End Constructor Sub Manager.Display() Print "Name: "; name Print "ID: "; id Print "Department: "; department End Sub Dim m As Manager = Manager("Alice", 1001, "Engineering") m.Display()
This shows a three-level inheritance hierarchy: Manager extends Employee, which extends Person. Each derived type adds new fields while inheriting all previous ones. The Manager constructor chains through both parent constructors.
Overriding Methods
Derived types can override base type methods to provide specialized behavior.
Type Shape Public: Declare Function Area() As Double End Type Function Shape.Area() As Double Return 0 End Function Type Circle Extends Shape Public: radius As Double Declare Constructor(radius As Double) Declare Function Area() As Double End Type Constructor Circle(radius As Double) This.radius = radius End Constructor Function Circle.Area() As Double Return 3.14159 * radius * radius End Function Type Square Extends Shape Public: side As Double Declare Constructor(side As Double) Declare Function Area() As Double End Type Constructor Square(side As Double) This.side = side End Constructor Function Square.Area() As Double Return side * side End Function Dim shapes(1 To 2) As Shape Ptr shapes(1) = New Circle(5.0) shapes(2) = New Square(4.0) For i As Integer = 1 To 2 Print "Area: "; shapes(i)->Area() Delete shapes(i) Next
Shape defines a generic Area() method. Circle and Square override it with their specific implementations. The array of Shape pointers demonstrates polymorphism - calling Area() invokes the appropriate derived class implementation.
Abstract Base Class
FreeBasic can simulate abstract base classes using pure virtual methods.
Type Animal Abstract Public: Declare Abstract Sub Speak() End Type Type Cat Extends Animal Public: Declare Sub Speak() End Type Sub Cat.Speak() Print "Meow" End Sub Type Dog Extends Animal Public: Declare Sub Speak() End Type Sub Dog.Speak() Print "Woof" End Sub Dim animals(1 To 2) As Animal Ptr animals(1) = New Cat() animals(2) = New Dog() For i As Integer = 1 To 2 animals(i)->Speak() Delete animals(i) Next
The Animal type is marked Abstract with an Abstract Speak() method. Derived types must implement Speak(). This enforces an interface that all animals must follow. The Abstract keyword prevents instantiation of the base class.
Multiple Inheritance with Interfaces
FreeBasic supports multiple inheritance through abstract interfaces.
Type IPrintable Abstract Public: Declare Abstract Sub Print() End Type Type IScannable Abstract Public: Declare Abstract Sub Scan() End Type Type Printer Public: Declare Sub Print() End Type Sub Printer.Print() Print "Printing document..." End Sub Type Scanner Public: Declare Sub Scan() End Type Sub Scanner.Scan() Print "Scanning document..." End Sub Type MultiFunctionDevice Extends Printer, Scanner Public: Declare Sub Fax() End Type Sub MultiFunctionDevice.Fax() Print "Sending fax..." End Sub Dim mfd As MultiFunctionDevice mfd.Print() mfd.Scan() mfd.Fax()
This demonstrates multiple inheritance. MultiFunctionDevice inherits from both Printer and Scanner. Each parent type implements a different interface. The derived type combines all capabilities and adds new ones.
Constructor Chaining
Constructors in inheritance hierarchies must properly chain to base constructors.
Type BaseType Public: value As Integer Declare Constructor(v As Integer) End Type Constructor BaseType(v As Integer) value = v Print "BaseType constructor: "; value End Constructor Type DerivedType Extends BaseType Public: text As String Declare Constructor(v As Integer, t As String) End Type Constructor DerivedType(v As Integer, t As String) Base(v) text = t Print "DerivedType constructor: "; text End Constructor Dim d As DerivedType = DerivedType(42, "Hello") Print "Final object: "; d.value; ", "; d.text
The DerivedType constructor must call the BaseType constructor using Base(). Constructors are called from the base up to the most derived type. Fields are initialized in the same order. Proper constructor chaining ensures complete object initialization.
Best Practices
- Design: Use inheritance only for true "is-a" relationships.
- Depth: Limit inheritance depth to 2-3 levels for clarity.
- Composition: Prefer composition over deep inheritance.
- Abstract: Use abstract base classes to define interfaces.
- Virtual: Mark methods as virtual when they should be overridable.
This tutorial covered the FreeBasic Extends
keyword with practical
examples showing inheritance in different scenarios. Proper use of inheritance
leads to cleaner, more maintainable code.
Author
List all FreeBasic Tutorials.