program class_intro;

{$mode objfpc}{$H+}

type TGrandParent = class(TObject)
	procedure WriteAboutMyself;
end;

procedure TGrandParent.WriteAboutMyself;
begin
	WriteLn();
	WriteLn('The name of this class is ', self.ClassName);
	WriteLn('  its parent is ', self.ClassParent.ClassName);
	WriteLn('    its InstanceSize is ', self.InstanceSize);
	WriteLn('      its declaration is located in ', Self.UnitName);
end;

type
	TParent = class(TGrandParent)
		FintField: integer;
	end;

	TChild = class(TParent)
		FsetField: set of byte;
	end;

var exampleClass: TGrandParent;
begin
	exampleClass := TGrandParent.Create;
	exampleClass.WriteAboutMyself;
	exampleClass.Free;

	exampleClass := TParent.Create;
	exampleClass.WriteAboutMyself;
	exampleClass.Free;

	exampleClass := TChild.Create;
	exampleClass.WriteAboutMyself;
	exampleClass.Free;

	{$IFDEF WINDOWS}
	ReadLn;
	{$ENDIF}
end.
