- •Министерство образования российской федерации Воронежский государственный технический университет а.Г. Остапенко г.А. Кащенко и.В.Давыдов Морев д.Е.
- •Воронеж 2001
- •Рецензенты: Остапенко г.А.
- •Введение
- •Методы разработки программного обеспечения
- •Подходы к разработке программного обеспечения
- •Планирование разработки программного обеспечения
- •Основные типы языков программирования.
- •Процедурное программирование
- •Функциональное программирование
- •Логическое программирование
- •Объектно-ориентрованное программирование
- •Процедуры.
- •Модули.
- •Абстрактные типы данных.
- •Построение программного обеспечения по объектно-ориентированной методике
- •2.1. Функционирование объектно-ориентированного программного обеспечения
- •2.2. Классы. Отношения между классами
- •Этапы построения программного обеспечения
- •2.4. Объектно-ориентированный анализ
- •Информационные модели
- •Жизненные циклы
- •Модели процессов
- •2.5. Нотация для объектно-ориентированного проектирования
- •2.6. Объектно-ориентированное проектирование – ood
- •2.7. Заключительное замечание
- •Основные недостатки:
- •3. Средства объектно-ориентированного программирования
- •Средства объектно-ориентированного рограммирования Turbo-Pascal
- •Понятие “объект”
- •Статические и виртуальные методы. Полиморфизм Статические методы
- •Виртуальные методы. Полиморфизм
- •Конструкторы и деструкторы
- •3.1.5. Сравнимость данных типа объект
- •3.1.6. Динамический вызов объектов
- •3.2. Средства объектно-ориентированного
- •Понятие “класс”
- •Компоненты классов. Доступ к ним.
- •Дружественные функции
- •Конструкторы и деструкторы
- •Статические члены классов
- •3.2.6. Перегрузка операций
- •3.2.7. Виртуальные функции
- •3.2.8. Динамическое создание объектов
- •3.2.9. Проверьте свои знания!
- •Литература:
- •Оглавление
- •Воронежский государственный технический университет,
- •394026 Воронеж, Московский просп. 14
Конструкторы и деструкторы
Если в описании объекта имеются виртуальные методы, конструкторы или деструкторы, компилятор создаёт специальное поле, именуемое таблицей виртуального метода VMT (Virtual Method Table). Длина поля VMT 16 битов. Он расположен в области данных и инициализируется конструктором при его вызове.
Пример.
Type
LocationPtr=^Location; {тип указателя на объект}
Location = object
X,Y:integer;
Procedure Init(InitX,InitY:integer);
Function GetX:integer;
Function GetY:integer;
End;
PointPtr=^Point
Point = Object(Location)
Visible:Boolean;
Constructor Init(InitX,InitY:integer); {конструктор}
Procedure Show;Virtual; {виртуальный метод}
Procedure Hide;Virtual; {виртуальный метод}
Function IsVisible:Boolean;
Procedure MoveTo(NewX,NewY:integer);
End;
CirclePtr=^Circle;
Circle = Object(Point)
Radius:integer;
Constructor Init(InitX,InitY:integer;InitRadius:integer);
Procedure Show;Virtual;
Procedure Hide;Virtual;
Procedure Expand(ExpandBy:integer);Virtual;
Procedure Contract(ContractBy:integer);Virtual;
End;
Расположение данных в памяти показано на рис. 2.3. Объект Location не содержит виртуальных методов, конструктора и деструктора; поэтому среди данных нет VMT. Объект Point базируется на объекте Location. Поэтому сначала следует поле данных Location, затем его собственные поля, сначала данные (Visible), затем VMT. Объект Circle базируется на объекте Point, поэтому сначала следуют все поля Point, включая VMT, а затем его собственные данные (Radius).
Location Point Circle
Рис. 2.3. Расположение данных в памяти
Поле VMT содержит адрес таблицы виртуального метода. Выделение в памяти места и заполнение VMT осуществляется транслятором автоматически; программисту VMT недоступно. Первое Слово в VMT (рис.2.4) содержит длину объекта, связанного с данным VMT. Эту информацию использует конструктор и деструктор, чтобы узнать, солько байтов необходимо зарезервировать (или освободить) при динамическом создании и уничтожении объектов операторами New и Dispose. Второе слово в VMT содержит отрицательное значение длины объекта (длину в дополнительном коде). Эта информация используется во время выполнения программы для определения: инициализирован объект или нет. Если объект инициализирован, то первое слово в VMT не должно быть равным нулю. Если это условие не выполнено, генерируется ошибка 210 времени выполнения. Проверка выполняется, если задана диреутива компилятора {&R+}. Наличие этой директивы удлиняет программу, поэтому ею целесообразно пользоваться во время отладки. После завершения отладки необходимо транслировать программу директивой {&R-}. За этими двумя словами в VMT следуют 32-битовые поля, по одному на каждый виртуальный метод, в последовательности их объявления в описании объекта. Каждое такое поле содержит адрес точки входа в метод (см. рис. 2.4). Для каждого объекта имеется только одно VMT, независимо от того, сколько переменных типа “объект” объявлено. Допустим, объявлены переменные P, Q типа (объект) Point и переменные C, D типа Circle. Тогда всем четырем переменным соответствуют свли поля данных (включая поле адреса VMT). Однако существуют только два VMT (для Point и для Circle).
Конструктор P.Init записывает фактический адрес VMT в соответствующие поля памяти переменной P. Аналогично работают конструкторы при инициализации других переменных типа объект.
Деструкторы используются при динамическом создании и уничтожении объектов (рассмотрим это в следующем параграфе).
Point VMT Circle VMT
Рис. 2.4. Структура VMT