Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.06.24;
Скачать: [xml.tar.bz2];

Вниз

Почему у 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.042 c
15-1180117320
Cerberus
2007-05-25 22:22
2007.06.24
Посоветейте КПК.


1-1177519158
Мэло
2007-04-25 20:39
2007.06.24
Клиент для браузерной игры.


2-1181029853
CodeGear Delphi for Win 32
2007-06-05 11:50
2007.06.24
как распокавать zip


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


2-1180461397
sdedwqe
2007-05-29 21:56
2007.06.24
record





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский