Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.02;
Скачать: CL | DM;

Вниз

смогу ли я быть программистом   Найти похожие ветки 

 
@!!ex ©   (2007-10-26 17:52) [160]

> [159] KSergey ©   (26.10.07 17:45)

Это не объясянет, почему нельзя передать в качестве параметра наследника класса, который требуется передать. Ведь наследник в точности повторяет структуру родителя+ еще свои поля имеет, которые будут просто игнорироваться.


 
KSergey ©   (2007-10-26 18:22) [161]

> @!!ex ©   (26.10.07 17:52) [160]
> > [159] KSergey ©   (26.10.07 17:45)
>
> Это не объясянет, почему нельзя передать в качестве параметра
> наследника класса, который требуется передать. Ведь наследник
> в точности повторяет структуру родителя+ еще свои поля имеет,
>  которые будут просто игнорироваться.

Однако и это понятно: причина - в природе "ссылок на классы" в дельфи.
И в самом деле: эти самые ссылки - по сути указатели на объект. На занимаемую объектом память.
Пусть есть

TClassA = class
...
end;

TClassB = class(TClassA)
...
end;

procedure SomeProc(var aClass: TClassA);
begin
  aClass := TClassB.Create;
end;


И вот теперь представьте: передаем по сути указатель на указатель (crux, привет!) свято веря внутри SomeProc, что имеем дело с объектом А, а вот вызывающая функция как раз подразумевает, что ей вернули ссылку на B, и начинает с ним работать как с В. Пипец, правда?

Пока писал это, в голову пришел даже еще более плохой пример:

TClassA = class ... end;
TClassB = class(TClassA) ... end;
TClassС = class(TClassA) ... end;

procedure SomeProc(var aClass: TClassA);
begin
  aClass := TClassB.Create;
end;


Представьте что будет, если вызывающая функция будет выглядеть так:

var
  cl: TClassC;
begin
  SomeProc(cl);
...


Т.е. SomeProc законно присваивает параметру ссылку на TClassB, в то время как вызывающая далее работает с С!!!

А вот в С++ таких проблем не возникает, т.к. там если передается ссылка - то гарантированно на готовый экземпляр.


 
KSergey ©   (2007-10-26 18:25) [162]

Сорри. Поправки.

> KSergey ©   (26.10.07 18:22) [161]
> в природе "ссылок на классы" в дельфи.

В природе "ссылок на экземпляры" конечно же.

И в первом примере должно быть так:

TClassA = class
end;

TClassB = class(TClassA)
end;

procedure SomeProc(var aClass: TClassA);
begin
  aClass := TClassА.Create;
end;


 
@!!ex ©   (2007-10-26 19:18) [163]

> [161] KSergey ©   (26.10.07 18:22)

Спасибо!
То что нужно. Все, я понял теперь. Это за доказательство сойдет.



Страницы: 1 2 3 4 5 вся ветка

Текущий архив: 2007.12.02;
Скачать: CL | DM;

Наверх




Память: 0.73 MB
Время: 0.055 c
6-1175247082
Wolchonok29
2007-03-30 13:31
2007.12.02
Передача потока


2-1194634076
_Levin
2007-11-09 21:47
2007.12.02
Организовать цикл.


8-1170238744
Alek_1
2007-01-31 13:19
2007.12.02
делаем видео происходящего на экране


2-1194597655
allucard
2007-11-09 11:40
2007.12.02
Работа с массивом через указатели


15-1193473003
Evanescence
2007-10-27 12:16
2007.12.02
Где можно почитать про тонкие терминальные клиенты?