Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему у TObject'а constructor static, а destructor - dynamic?


TStas ©   (2007-06-04 13:38:00) 

Собственно сабж. Вот пришлось несколько классов написать и задумался, а почему?


Kolan   (2007-06-04 19:12:00) [1]

ДА действительно должен быть виртуальным. Благодарю.


Однокамушкин   (2007-06-04 19:10:00) [2]


> Kolan ©   (04.06.07 17:24) [7]
> А что за глюки можно словить…

Пусть есть два класса: TAncestor и TDescendant, и TDescendant является наследником TAncestor... рассмотрим код...

var
 x: TAncestor;
begin
 x := TDescendant.Create; // x имеет тип TAncestor, но объект, на который она указывает, TDescendant
 ...
 x.Free;
end;


Если деструктор не будет вируальным, здесь будет вызван TAncestor.Destroy... соответственно, объект не будет удалён правильно, потому что TAncestor.Destroy не может освободить те ресурсы, которые есть в TDescendant, но нет в TAncestor... а неосвобождённый вовремя ресурс - это глюк...


TStas   (2007-06-04 19:05:00) [3]

>Игорь Шевченко Спасибо за уточнение. Я имел в виду, что его перекрыть можно


Anatoly Podgoretsky   (2007-06-04 18:22:00) [4]

> Kolan  (04.06.2007 17:46:09)  [9]

Не обязан, но на корню убиваешь полиморфизм.


default   (2007-06-04 18:02:00) [5]

Kolan ©   (04.06.07 17:46) [9]
реально иди читай теорию:)


Kolan   (2007-06-04 17:46:00) [6]

> Почитайте теорию ООП :)

В той теории что я читал не говорилось что «механизм удаления обязан быть полиморфным».


b z   (2007-06-04 17:42:00) [7]


> Kolan ©   (04.06.07 17:24) [7]
> Я для целей самообразования спрашиваю.

Почитайте теорию ООП :)


Kolan   (2007-06-04 17:24:00) [8]

> А чтобы глюки не ловить

А что за глюки можно словить…
ЗЫ
 Я для целей самообразования спрашиваю.


Однокамушкин   (2007-06-04 17:22:00) [9]


> Kolan ©   (04.06.07 17:20) [5]

А чтобы глюки не ловить, когда тип ссылки не будет соответствовать реальному типу объекта...


Kolan   (2007-06-04 17:20:00) [10]

> Потому что, во-первых, механизм удаления обязан быть полиморфным

Почему?


Игорь Шевченко   (2007-06-04 15:11:00) [11]

деструктор не dynamic, а виртуальный. Некоторая разница


Loginov Dmitry   (2007-06-04 14:02:00) [12]

> Почему у TObject'а constructor static


Потому что в собственном классе ты можешь переопределить конструктор с конкретным набором параметров, поэтому делать его Virtual у TObject - бессмысленно. Вообще виртульные конструкторы полезны в целях автоматизации загрузки объектов из файлов/потоков и т.п., но при этом все классы, обеспечивающие такую возможность, следует регистрировать. Другое использование виртуальных конструкторов мне неизвестно.


> destructor - dynamic


Здесь-то как может быть иначе?


Однокамушкин   (2007-06-04 14:02:00) [13]

Потому что, во-первых, механизм удаления обязан быть полиморфным, а механизм создания - нет... а во-вторых, у конструкторов могут быть разные наборы параметров в зависимости от класса, так что там всё равно не всегда есть смысл их перекрывать... А вот деструктор, он всегда без параметров...


Плохиш   (2007-06-04 13:47:00) [14]


> Почему у TObject'а constructor static

Конструктор всегда вызывается явно

> а destructor - dynamic?

Деструктор никогдане вызывается явно


Наверх

Титульная страница Поиск, карта сайта Написать письмо