![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему у 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?
Деструктор никогдане вызывается явно