![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Правильное оформление деструктора
Vitaliy_____ © (2009-06-18 13:43:00)И снова здравствуйте!
Продолжим тему, поднятую в
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1242878656&n=18
Суть вопроса такая:
Имеется "базовый класс", наследуемый от TObject.
Здесь все сделано как мы разобрались,
destructor destroy; override;
От него наследуется другой класс. Как в данном случае описать деструктор?
Необходимо чтобы также был выполнен сначала деструктор наследуемого класса, затем "базового".
Как тут правильно описать?
То есть, имеем иерархию TObject-Class1-Class2.
Как описать деструктор в Class2, чтобы при вызове TObject(elem).Free у нас выполнились все 3 деструктора (Class2, Class1 и, собственно, TObject).
inherited в конце деструкторов стоит.
Собственно, вопрос даже в том, будет ли еще раз перекрыт TObject.destroy если мы в Class2 напишем destructor destroy; override;?
И нужно ли в Class1 описать деструктор как virtual?
Dennis I. Komarov (2009-06-18 14:25:00) [1]А в генофонде покапаться? Там же одно на другом...
Vitaliy_____ (2009-06-18 14:21:00) [2]Ну, раз люди говорят... Стоит поверить.
А то знаете ли, день рабочий [у нас] уже заканчивается, голова тяжелая, мало ли что в голову взбредет, а потом разгребай это все :)
Loginov Dmitry (2009-06-18 14:14:00) [3]Убедился?)
Ega23 (2009-06-18 14:13:00) [4]
> СНОВА перекроет TObject.destroy...
Строго говоря, она его не перекроет. Она перекроет метод Destroy прямого класса-предка. В случае, когда предок - TObject, то да, перекроет TObject.Destroy
Vitaliy_____ (2009-06-18 14:11:00) [5]И тем не менее, хотелось убедиться, что для следующего уровня наследования директива override; СНОВА перекроет TObject.destroy...
Если есть сомнения, лучше спросить, чем потом голову ломать ведь так :)
Ega23 (2009-06-18 14:09:00) [6]
> гарантированно выполнятся все деструкторы
Скажем так, они должны выполнится. А вот выполнятся-ли - зависит от мозгов и рук разработчика.
Loginov Dmitry (2009-06-18 14:05:00) [7]В той ветке же все объяснили. Ни надо ничего выдумывать. Нужно просто делать
TLineData = class(TObject)
...
destructor destroy; override;
end;
...
destructor TLineData.destroy;
begin
....
inherited;
end;
и так для любого класса независимо от уровня наследника.
В этом случае при вызове TObject.Free гарантированно выполнятся все деструкторы. Это же так просто!)