Operator is sometimes misleads. In your case all is ok because classes which are checked are from last row of hierarchy. But your hierarchy isn't correct. Let consider following example (how many ifs will be executed?):
TLivingThing = class
end;
TAnimal = class(TLivingThing)
end;
THuman = class(TAnimal)
end;
TWolf = class(TAnimal)
end;
procedure Check;
var
a: THuman;
begin
a := THuman.Create;
if a is TLivingThing then
begin
MessageBox('TLivingThing');
//Do something useful here
end;
if a is TAnimal then
begin
MessageBox('TAnimal');
//Do something useful here
end;
if a is THuman then
begin
MessageBox('THuman');
//Do something useful here
end;
end;
In this example you receive:
TLivingThing
TAnimal
THuman
If you wanted call only one if, you are wrong. Better solution is use
if a.ClassName = TLivingThing.ClassName then ...
if a.ClassName = TAnimal.ClassName then ...
if a.ClassName = THuman.ClassName then ...
In this case proper if will be called. This is very important if you use in if chain ancestors and descendants.