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

Вниз

Почему у TObject а constructor static, а destructor - dynamic?   Найти похожие ветки 

 
TStas ©   (2007-06-04 13:38) [0]

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


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


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

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

> а destructor - dynamic?

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


 
Loginov Dmitry ©   (2007-06-04 14:02) [2]

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


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


> destructor - dynamic


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


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

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


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

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


 
Kolan ©   (2007-06-04 17:20) [5]

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

Почему?


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


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

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


 
Kolan ©   (2007-06-04 17:24) [7]

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

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


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


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

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


 
Kolan ©   (2007-06-04 17:46) [9]

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

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


 
default ©   (2007-06-04 18:02) [10]

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


 
Anatoly Podgoretsky ©   (2007-06-04 18:22) [11]

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

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


 
TStas ©   (2007-06-04 19:05) [12]

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


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


> 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... а неосвобождённый вовремя ресурс - это глюк...


 
Kolan ©   (2007-06-04 19:12) [14]

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



Страницы: 1 вся ветка

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

Наверх




Память: 0.49 MB
Время: 0.024 c
15-1180480180
@BraIN
2007-05-30 03:09
2007.06.24
Что-то с Windows моим стало


15-1180096285
oldman
2007-05-25 16:31
2007.06.24
У кого есть "КонсультантПлюс" ???


2-1180972683
Bora_ru
2007-06-04 19:58
2007.06.24
Список функций и процедур в DLL


4-1168770920
SysProgram
2007-01-14 13:35
2007.06.24
Определение параметров пользователя


11-1162989060
heilong
2006-11-08 15:31
2007.06.24
layouts like QT в KOL