Теоретические сведения для студентов специальностей «Экономика и организация производства», страница 22

В С++ допускается образование производного класса от нескольких базовых классов (будет рассмотрено дальше). Общий синтаксис конструктора производного класса представляется следующим образом:

имя_ конструктора_ производного_ класса (список_ аргументов_ для_ производного_ класса): имя_ базового_ класса_1 (список_ аргументов_ для_ базового_ класса_1,..., имя_ базового_ класса_N (список_ аргументов_ для_ базового_ класса_N) {тело_ конструктора_ производного_ класса;}

Конструкторы производных классов всегда сначала вызывают конструктор базового класса. Если базовый класс, в свою очередь, является производным, то процесс вызова конструкторов продолжается по всей иерархии. Если в некотором классе конструктор не определен, то инициализируется конструктор по умолчанию (без аргументов). Заметим, что ссылка на конструктор базового класса дана не в объявлении конструктора производного класса, а в его определении.

Рассмотрим головную программу.

Т.к. мы используем графический режим работы, то необходимо инициализировать графическую систему (предполагается работа под MS/DOS). Функции поддержки и определение данных для графической системы располагаются в заголовочном файле graphics.h.

Функция initgraph имеет 3 параметра. Это указатели на переменные: номер графического драйвера, номер режима для этого драйвера и путь к директорию, содержащему bgi файл данного драйвера. Если первой переменной было присвоено значение detect (или 0), то сначала запускается функция автоматического тестирования аппаратуры с целью определения типа дисплейного адаптера. По результатам тестирования функция initgraph переходит к загрузке соответствующего bgi файла. Третий параметр в функции initgraph(&gd,&gn,""); определяет путь доступа к директорию, где располагается bgi файл драйвера. Отсутствие информации в кавычках "" говорит о том, что файл располагается в текущем директории (там же, где соответствующий исполняемый модуль программы (ехе-модуль)).

Дальше определяется объект my_point(300,200,4). Конструктор класса Point вызывает конструктор базового класса Location, передает ему параметры для инициализации переменных экземпляра объекта класса Location, входящего в состав создаваемого объекта my_point, а затем выполняется собственный код конструктора Point, завершая построение объекта. Внешне эти процессы будут сопровождаться выводом текста:

работает конструктор Location

работает конструктор Point

Затем для объекта my_point вызывается метод putpixel(), который выводит на экран точку красного цвета с координатами 200,300.

Следует обратить внимание на то, что функция класса Point putpixel имеет то же имя, что и библиотечная функция. Поэтому, для исключения рекурсивных вызовов и ошибок в программе, записывается префикс ::(разрешение области действия) перед библиотечной функцией. Имя приобретает контекст глобального, что устраняет возможные неоднозначности при выполнении программы.

Далее работают методы getx и gety для объекта my_point.

Выводятся строки:

          х=300

          y=200

Метод show_mess выводит сообщение:

          Нажмите любую клавишу

Дальше следует функция останова getch() - до нажатия любой клавиши и функция closegraph() - закрывающая графическую систему.

Выше говорилось о полиморфизме, как об одном из фундаментальных свойств ООП и о механизмах раннего и позднего связывания. В С++ свойство полиморфизма распространяется на функции и операторы. При раннем связывании полиморфизм проявляется как перегрузка функций и операторов (операций) на этапе компиляции. При позднем связывании - в вызовах виртуальных функций. В этом случае связывание вызова с кодом конкретной функции осуществляется на этапе выполнения программы.

Преимущество раннего связывания: высокая скорость выполнения программы, малые затраты памяти. Недостаток - потеря гибкости при программировании задач.

Позднее связывание предполагает вызовы виртуальных функций. Преимущество позднего связывания - большая гибкость программирования при некотором снижении скорости выполнения.