Se me ocurre utilizar punteros, pero eso complica un poco las cosas...
Hablo de memoria, pero sería algo así:
Código Delphi
[-]
type
TElemento = record
id: integer
tipo: string;
dato: pointer;
end;
TAnimal = record
nombre: string;
peso: integer;
edad: integer;
end
TPlanta = record
especie: strnig
aguanecesaria: integer;
end
var
PElemento: ^TElemento;
PAnimal: ^TAnimal;
PPlanta: ^TPlanta;
begin
UnElemento := New(PElemento);
UnElemento.id := 1;
UnElemento.tipo := 'ANIMAL';
UnElemento.dato := New(PAnimal);
PAnimal(UnElemento.dato)^.nombre := 'CHUCHO';
...
UnElemento := New(PElemento);
UnElemento.id := 2;
UnElemento.tipo := 'PLANTA';
UnElemento.dato := New(PPlanta);
PPlanta(UnElemento.dato)^.especie := 'GRIASOL';
...
Dispose(UnElemento.dato);
Dispose(UnElemento);
end;