Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.013 c
15-1180367908
GeLLeR
2007-05-28 19:58
2007.06.24
Окончил музыкальную школу с красным дипломом!


4-1168369137
bsasha
2007-01-09 21:58
2007.06.24
Выборка более 1000 записей из AD


15-1179983146
Riply
2007-05-24 09:05
2007.06.24
Драйвер с именем " " (9 пробелов).


2-1180523061
_vl_
2007-05-30 15:04
2007.06.24
Ссылка на массив


2-1180686571
KyRo
2007-06-01 12:29
2007.06.24
Частота дискредитации




   Наверх