{{fbdoc item="title" value="BASE (member access)"}}----
Provides explicit access to base type members in non-static methods of a ##[[KeyPgType|Type]]##

{{fbdoc item="syntax"}}##
	**base**.//member//
	**base** [ .**base** ... ] .//member//
##
{{fbdoc item="desc"}}
	##**Base**## provides a way to explicitly access members of a specific base type, in the context of non-static methods of a user-defined type derived from another type using ##[[KeyPgExtends|Extends]]##.
	
	By using ##**Base**## repeatedly, as in ##base.base.base.member##, it is possible to access any desired base type, in case there are multiple levels of inheritance.
	
	##**Base**## is especially useful when a base type's member is shadowed by a local variable or member of a derived type using the same identifier. ##**Base**## then allows unambiguous access to the base type.
	
	For virtual methods, base.method() always calls the base method and never the overriding method.
	
	**Note:** There is no specific syntax with ##**Base**## to access a member operator of a specific base type. The only way is to apply the operator on the instance beforehand up-casted to the right type (but for virtual operators, this workaround does not allow to call the base operator when overridden, because that does not modify the run-time type of the instance but only its compile-time type).

{{fbdoc item="ex"}}
{{fbdoc item="filename" value="examples/manual/udt/base.bas"}}%%(freebasic)
Type Parent
	As Integer a
	Declare Constructor(ByVal As Integer = 0)
	Declare Sub show()
End Type

Constructor Parent(ByVal a As Integer = 0)
	This.a = a
End Constructor

Sub Parent.show()
	Print "parent", a
End Sub

Type Child extends Parent
	As Integer a
	Declare Constructor(ByVal As Integer = 0)
	Declare Sub show()
End Type

Constructor Child(ByVal a As Integer = 0)
	'' Call base type's constructor
	Base(a * 3)
	This.a = a
End Constructor

Sub Child.show()
	'' Call base type's show() method, not ours
	Base.show()
   
	'' Show both a fields, the base type's and ours'
	Print "child", Base.a, a
End Sub

Type GrandChild extends Child
	As Integer a
	Declare Constructor(ByVal As Integer = 0)
	Declare Sub show()
End Type

Constructor GrandChild(ByVal a As Integer = 0)
	'' Call base type's constructor
	Base(a * 2)
	This.a = a
End Constructor

Sub GrandChild.show()
	'' Call base type's show() method, not ours
	Base.show()
   
	'' Show both a fields, the base.base type's, the base type's and ours'
	Print "grandchild", Base.Base.a, Base.a, a
End Sub

Dim As GrandChild x = GrandChild(3)
x.show()
%%
{{fbdoc item="lang"}}
	- Methods are only supported in the //[[CompilerOptlang|-lang fb]]// dialect, hence ##**Base**## has no function in other dialects.

{{fbdoc item="diff"}}
	- New to ""FreeBASIC""

{{fbdoc item="see"}}
	- ##[[KeyPgBaseInit|Base (initializer)]]##
	- ##[[KeyPgThis|This]]##
	- ##[[KeyPgType|Type]]##
	- ##[[KeyPgExtends|Extends]]##
	- ##[[KeyPgExtendsZstring|Extends Zstring]]##
	- ##[[KeyPgExtendsWstring|Extends Wstring]]##
	- ##[[KeyPgOptionbase|Option Base]]##

{{fbdoc item="back" value="CatPgUserDefTypes|User Defined Types"}}