|
Программирование >> Программирование на языке c++
2.3. Поддержка объектно-ориентированного программирования Одна из основных идей, лежащих в основе создания языка С++, - это поддержка объектно-ориентированного программирования. Для этого введено описание классов, реализованы механизмы наследования и вызова компонентов-функций различных классов, осуществлены принципы полиморфизма (см. §1.5): Механизмы вызова компонентов-функций различных классов являются очень важными и заключаются в следующем. Вернемся к рассмотрению графических объектов и предположим, что мы определили компонент-функцию НАРИСОВАТЬ. Первоначально это компонент-функция абстрактного графического объекта. Далее, используя механизмы наследования, мы определим аналогичную функцию для конкретных объектов, которые наследуются из первоначального абстрактного графического объекта. Пусть конкретным объектом является ОКРУЖНОСТЬ или КВАДРАТ. Предположим, мы хотим использовать указатель POINTER на объект. Тогда по аналогии с языком С можно вызвать компонент-функцию следующим образом: POINTER -> НАРИСОВАТЬ. Значение POINTER можно менять в программе после того, как программа уже скомпилирована. Тогда возникает вопрос: если записано выражение POINTER -> НАРИСОВАТЬ, то для какого графического объекта будет вызвана функция НАРИСОВАТЬ, учитывая, что POINTER - указатель на абстрактный объект (ведь функция НАРИСОВАТЬ определена для обоих объектов КВАДРАТ и ОКРУЖНОСТЬ). Конкретную функцию НАРИСОВАТЬ можно будет определить только на этапе выполнения программы (после того, как программа будет уже скомпилирована). При этом нужно следовать таким правилам: где а и b - новые объекты, то мы должны дать ответы на вопросы: можно ли присвоить значение b объекту а или нельзя; если можно, то какие преобразования сначала надо выполнить. -♦ если в процессе т.шолпспия программы POINTER получает такое повое значение, что оно указывает на объект ОКРУЖНОСТЬ, необходимо вызвать функцию НАРИСОВАТЬ дая обг.скта ОКРУЖНОСТЬ; -♦ если в процессе выполнения программы POINTER получает такое повое значение, что оно указывает на объект КВАДРАТ, нужно вызвать функцию НАРИСОВАТЬ для объекта КВАДРАТ. Для того чтобы реализовать эти правила в программе, функция НАРИСОВАТЬ объявляется как виртуальная (для этих целей используется ключевое слово virtual). Рассмотрим пример: class ГРАФИЧЕСКИЙ ОБЪЕКТ { public: virtual void HAPMCOBATb(void); ................. } *P; class ОКРУЖНОСТЬ : public ГРАФИЧЕСКИЙ ОБЪЕКТ{ public: void HAPMCOBATb(void); ................. } o o; class КВАДРАТ : public ГРАФИЧЕСКИЙ ОБЪЕКТ { public: void HAPMCOBATb(void); ................. } o k; p = &o o; p -> НАРИСОВАТЬО; вызов функции для объекта ОКРУЖНОСТЬ р = &о к; р -> НАРИСОВАТЬО; вызов функции для объекта КВАДРАТ Знак используется в языке С++ для записи комментариев, которые могут быть продолжены от этого знака до конца текущей строки. Виртуальные функции обеспечивают механизм косвенного вызова функции через специальные таблицы (см. прил. 2.2). Фактически указатель (р или POINTER) позволяет косвенно получить доступ к виртуальной таблице, хранимой в памяти компьютера. В виртуальной таблице хранятся указатели на виртуальные функции. Когда мы меняем значения указателя (р или POINTER), то получаем доступ к разным виртуальным таблицам (см. прил. 2.2). Вызов функции фактически осуществляется так: р->объект->виртуальная таблица->функция то есть, например, р->объект класса ОКРУЖНОСТЬ-> виртуальная таблица для класса 0КРУЖ1-10СТЬ-> указатель на функцию для класса ОКРУЖНОСТЬ-> функция НАРИСОВАТЬ для класса ОКРУЖНОСТЬ Язык С++ поддерживает виртуальные функции, а также другие механизмы пакетирования, наследования, полиморфизма и передачи сообщений, описанные в § 1.5, 1.6. 2.4. Операторы для динамического выделения и освобождения памяти При написании программ часто возникает необходимость динамического выделения и освобождения памяти. Понятие динамическое означает, что память может быть выделена на этапе выполнения программы и потом освобождена также на этапе выполнения программы. Это позволяет использовать освобожденное пространство памяти для других целей. Оперативная память компьютера условно разбивается на логические части. Одна из таких частей называется free store (свободная память) или heap. Именно в этой части и происходит динамическое выделение. Размер этой части ограничен, поэтому запрос на выделение памяти не всегда удовлетворяется. Для работы с динамической памятью в языке С использовались библиотечные функции типа calloc, malloc, realloc, free
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |