Yo creo que hay algo confuso aquí. Según describes, tienes estas clases:
Código Delphi
[-]
type
TParrafo = class
...
procedure Asignar(P: TParrafo); virtual; abstract;
end;
TPregunta = class(TParrafo)
...
procedure Asignar(P: TParrafo); override;
end;
TRespuesta = class(TParrafo)
...
procedure Asignar(P: TParrafo); override;
end;
TTematica = class(TParrafo)
...
procedure Asignar(P: TParrafo); override;
end;
En este caso, el método Asignar acepta cualquier objeto de tipo TParrafo y
cualquier descendiente de TParrafo. No debe haber ningún error de compilación.
// Saludos