Форум: "Начинающим";
Текущий архив: 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]> А чтобы глюки не ловить
А что за глюки можно словить…
ЗЫ
Я для целей самообразования спрашиваю.
← →
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