IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> ООП в Tp
сообщение
Сообщение #1


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Как реализовать такое на 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.










Добавлено:
Вопрос решен smile.gif


  TB(A^).Create;


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Вот в чем тут проблема понять не могу, ситуация такая-же, но теперь у предка и потомка разные конструкторы, в простеньком примере проходит, а чуть посложнее уже не берет, в чем проблема ?

Работает:

{$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.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Причина в том, что в наследника есть новые поля, которые при конвертации будут не заполнены и чтобы не произошло ошибки паскаль не даёт делать такое.

Сообщение отредактировано: Bokul -


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Type
PTCircle = ^TCircle;
...
var
T: ^TFigure;
begin
T := new(PTCircle, Create(1, 1, 1));
end.

?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


volvo, но он же пытается сделать обратное.


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Что "обратное"? Он пытается привести ^TFigure к ^TCircle, и создать экземпляр объекта, или я чего-то не заметил?

В результате что должно получиться? Указатель на предка должен хранить адрес потомка... А я что предложил?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


TB(A^).Create(3);

А что мы делаем тут? Выходит VMP предка будет указывать на VMT наследника?
Цитата
Он пытается привести ^TFigure к ^TCircle, и создать экземпляр объекта, или я чего-то не заметил?

Я так и полностью и не понял, запутанно все.


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Да, volvo прав, спасибо.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Цитата
А что мы делаем тут? Выходит VMP предка будет указывать на VMT наследника?

Все-равно интересно так будет или нет?


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Цитата
Выходит VMP предка будет указывать на VMT наследника?
Будет, и что в этом особенного? VMT инициализируется в конструкторе, конструктор был вызван для TB, вот и все... Если бы в TCircle не добавились новые поля, в связи с чем размер экземпляра объекта увеличился, можно было бы извращаться так и дальше (хотя New/Dispose придумали в расширенном виде именно для удобства, так почему не пользоваться ими, особенно функциональной, а не процедурной формой New)...

НО поскольку поля все же были добавлены - TypeCast (в этом направлении) уже не пройдет... Ты даже сам написал, почему...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 2.10.2020 2:20
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name