No es tan simple.
TPersistent únicamente implementa el mecanismo base para que las clases descendientes se "clonen", pero la implementación en sí debe hacerla cada descendiente.
TPersistent.Assign hace esto:
Código Delphi
[-]
procedure TPersistent.Assign(Source: TPersistent);
begin
if Source <> nil then Source.AssignTo(Self) else AssignError(nil);
end;
es decir, llama al método AssignTo (lo opuesto, semánticamente hablando) del objeto que se le pasa. Y TPersistent.AssignTo hace esto:
Código Delphi
[-]
procedure TPersistent.AssignTo(Dest: TPersistent);
begin
Dest.AssignError(Self);
end;
o sea, se limita a lanzar un mensaje de error
Código Delphi
[-]
procedure TPersistent.AssignError(Source: TPersistent);
var
SourceName: string;
begin
if Source <> nil then
SourceName := Source.ClassName else
SourceName := 'nil';
raise EConvertError.CreateResFmt(@SAssignError, [SourceName, ClassName]);
end;
En otras palabras, la clase TPersistent únicamente implementa el mecanismo de llamadas a Assign o AssignTo. Las clases descendientes deben redefinir al menos uno de los dos para que la copia pueda hacerse.
En el caso de TTabSheet, no hay tal redefinición.
// Saludos