Как реализовать такое на TP, используя объекты ? Пробовал приведением к типу, не выходит ...
{$mode objfpc}
type
TA = class
constructor Create;
procedure P; virtual;
end;
TB = class(TA)
constructor Create;
procedure P; override;
end;
constructor TA.Create;
begin end;
procedure TA.P;
begin writeln('TA') end;
constructor TB.Create;
begin Inherited Create end;
procedure TB.P;
begin writeln('TB') end;
var
A : ^TA;
begin
GetMem(A, sizeof(TA));
A^ := TB.Create;
A^.P;
end.
{$mode TP}
type
TA = object
constructor Create;
procedure P; virtual;
end;
TB = object(TA)
constructor Create;
procedure P; virtual;
end;
constructor TA.Create;
begin end;
procedure TA.P;
begin writeln('TA') end;
constructor TB.Create;
begin Inherited Create end;
procedure TB.P;
begin writeln('TB') end;
var
A : ^TA;
begin
GetMem(A, sizeof(TA));
A^.Create;
TB(A^).P;
end.
TB(A^).Create;
Вот в чем тут проблема понять не могу, ситуация такая-же, но теперь у предка и потомка разные конструкторы, в простеньком примере проходит, а чуть посложнее уже не берет, в чем проблема ?
Работает:
{$mode TP}
uses crt;
type
TA = object
constructor Create;
procedure P; virtual;
end;
TB = object(TA)
constructor Create(some: Integer);
procedure P; virtual;
end;
constructor TA.Create;
begin end;
procedure TA.P;
begin writeln('TA') end;
constructor TB.Create(some: Integer);
begin Inherited Create end;
procedure TB.P;
begin writeln('TB') end;
var
A : ^TA;
begin
clrscr;
GetMem(A, sizeof(TA));
TB(A^).Create(3);
TB(A^).P;
end.
{$mode TP}
type
TFigure = object
constructor Create;
destructor Done;
procedure Show; virtual;
procedure Refresh;
enabled: Boolean;
end;
TCircle = object(TFigure)
constructor Create(centrX, centrY, radius: Word);
procedure Show; virtual;
cx, cy, r: Word;
end;
constructor TFigure.Create;
begin end;
destructor TFigure.Done;
begin end;
procedure TFigure.Show;
begin end;
procedure TFigure.Refresh;
begin end;
constructor TCircle.Create(centrX, centrY, radius: Word);
begin inherited Create; end;
procedure TCircle.Show;
begin end;
var
T: ^TFigure;
begin
TCircle(T^).Create(1, 1, 1);
end.
Причина в том, что в наследника есть новые поля, которые при конвертации будут не заполнены и чтобы не произошло ошибки паскаль не даёт делать такое.
Type?
PTCircle = ^TCircle;
...
var
T: ^TFigure;
begin
T := new(PTCircle, Create(1, 1, 1));
end.
volvo, но он же пытается сделать обратное.
Что "обратное"? Он пытается привести ^TFigure к ^TCircle, и создать экземпляр объекта, или я чего-то не заметил?
В результате что должно получиться? Указатель на предка должен хранить адрес потомка... А я что предложил?
TB(A^).Create(3);
Да, volvo прав, спасибо.