- •Курсовая работа
- •Часть I. Разработка гипотетической машины.
- •1.Цель работы Целью данной курсовой работы является изучение стандартных макросредств ассемблера ibm pc.
- •2.Задание
- •3.Введение
- •4.Постановка задачи
- •5.Разработка алгоритма
- •Задачи удаления лишних знаков препинания и определения длины каждого слова не являются сложными и их можно реализовать не разбивая их на подзадачи.
- •BeginProg – Инициализация программы. Здесь производится привязка сегментных регистров к соответствующим сегментам.
- •6.Алгоритм
- •7.Результаты
- •8.Листинг программы
- •Часть II. Самостоятельная работа
- •Основные понятия и определения.
- •Описание типов и экземпляров объектов
- •Скрытые поля и методы.
- •Как сказано выше приватные поля и методы должны располагатся после общедоступных. Директива public позволяет, если это удобно, расположить их наоборот.
- •Наследование и переопределение .
- •Статические и виртуальные методы.
- •Виртуальные методы и полиморфизм.
- •Совместимость объектных типов.
- •Преимущества и недостатки виртуальных методов.
- •Заключение
- •Литература
Виртуальные методы и полиморфизм.
До сих пор мы рассматривали статические методы. Они являются таковыми в том же смысле, что и статическая переменная: компилятор размещает ее и определяет все ссылки на нее во время компиляции. Сами по себе сттические методы могут быть мощным инструментом для составления сложных программ. Но иногда при их использовании возникают проблемы, подобные описаным выше.
Выход заключается в том, что метод должен быть динамическим, а ссылки на него должны определяться во время выполнения программы. Для этого существует механизм виртуальных методов.
Виртуальные методы представляют собой чрезвычайно мощный инструмент для обобщения называемый полиморфизмом. Полиморфизм является способом присвоения действию имени, которое используется всеми объектами иерархии, причем каждый объект использует его определенным образом.
Пусть имеем иерархию геометрических фигур. Эта иерархия является хорошим примером полиморфизма в действии. Каждый тип объекта в иерархии представляет собой отдельный тип фигуры на экране: окружность, эллипс или др. Если возникает необходимость определить объекты для представления на экране других типов фигур , например треугольник, прямоугольник и т.д. , можно написать для каждого из них метод, который будет выводить на экран объект. Можно сказать, что все типы фигур имеют общую способность выводить себя на экран.
Особым для каждого типа объекта является способ отражения себя на экране. Можно отобразить любой тип фигуры, но механизм рисования каждой фигуры сугубо индивидуален. Слово “отобразить” используется для вывода многих фигур. То же самое в примере платежной ведомости: GetSum вычисляет размер выплат для различных лиц.
Это и есть полиморфизм.
При работе с объектами возникает ситуация когда сложный метод приходится давать заново для каждого типа объекта, хотя различия в поведении объектов могут быть небольшими. Хотелось бы иметь общий сложный метод, а различия вынести в сменные подчиненные методы. Эта идея называется конструктивным полиморфизмом. Осуществляется она с помощью виртуальных подчиненных методов. Нужно написать слово virtual, после заголовка каждого “сменного” метода в описании объектного типа, а для их подключения дать обращение к конструктору- блоку со специфическим заголовком
Конструктор является специальным типом процедуры, которая выполняет начальные установки для работы механизма виртуальных методов.
Поэтому перед вызовом любого виртуального метода необходимо вызвать конструктор этого объекта! Причем каждый отдельный экземпляр объекта должен быть инициализирован отдельным вызовом конструктора.
Constructor <имя блока> (<Перечень формальных параметров>)
Явно записанных действий в ней может и не быть, как и формальных параметров.
К конструктору надо обращаться для каждого объекта (не типа), использующего виртуальные методы, до их применения к этому объекту. Сами конструкторы виртуальными быть не могут. Даже если объект В обработан конструктором, после снятия его копии А (А:=В) требуется обращение к конструктору уже для копии.
Невиртуальные методы , как и простые блоки, подключаются при компиляции программы(т.е. раннее связывание). Для виртуальных методов каждого типа транслятор создает таблицу с их адресами – ТВМ, которая используется при выполнении. Когда происходит обращение к конструктору, последний заносит в специальное поле объекта ссылку на ТВМ данного объектного типа. Связь налажена. Ценою дополнительных затрат времени и памяти.
Объявление методов виртуальными должно быть обоснованным, т.к. связанно с расходованием ресурсов. Метод может быть объявлен виртуальным только вместе со всеми одноименными методами.
Каждый тип объекта , содержащий виртуальные методы , имеет таблицу виртуальных методов (ТВМ), хранящуюся в сегменте данных. ТВМ содержит размер типа объекта и для каждого виртуального метода указатель кода, исполняющий данный метод. Конструктор устанавливает связь между вызывающим его экземпляром объекта и ТВМ этого объекта.
Необходимо учесть, что имеется только одна ТВМ для каждого типа объекта. Отдельные экземпляры объекта содержат только адрес ТВМ, но не саму ТВМ. Конструктор устанавливает значение этого адреса. Поэтому вызов виртуального метода до вызова конструктора приведет к ошибке, т.к. к этому моменту поле адреса ТВМ еще не инициализировано и содержит неопределенный адрес.
Деструктор – это также как и конструктор спец. вид метода, который также называют “сборщиком мусора”.
Они объявляются с помощью ключевого слова Destructor вместо Procedure и нужны для удаления динамически размещенных объектов и освобождения занимаемой ими памяти. Как правило деструктор объединяет все действия по освобождению памяти так, чтобы очистку можно было выполнить за один вызов деструктора.
Деструкторы м.б. виртуальными и статическими, и разрешается их наследовать. Т.к. для различных типов объектов чаще всего требуется различные методы освобождения памяти, то рекомендуется всегда объявлять деструкторы виртуальными, благодаря чему для каждого типа объекта будет выполнен правильный деструктор.
