Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Создание программ на С++.doc
Скачиваний:
15
Добавлен:
29.09.2019
Размер:
1.59 Mб
Скачать

Что такое чисто виртуальные функции

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

Для создания чисто виртуальной функции ваша программа указывает прототип функции, но не указывает ее операторы. Вместо них программа присваивает функции значение ноль, как показано ниже:

class phone

{  public:     virtual void dial (char *number) =0; // Чисто виртуальная функция     void answer(void) { cout << "Ожидание ответа" << endl; }     void hangup(void) { cout << "Звонок выполнен - повесить трубку" << endl; }     void ring(void) { cout << "Звонок, звонок, звонок" << endl; }     phone(char *number) { strcpy(phone::number, number); };  protected:     char number[13];  };

Каждый производный класс, определенный в вашей программе, должен определить свою функцию вместо чисто виртуальной функции базового класса. Если производный класс опустит определение функции для чисто виртуальной функции, компилятор C++ сообщит о синтаксических ошибках.

Что вам необходимо знать

Полиморфизм представляет собой способность объекта изменять форму во время выполнения программы. В этом уроке рассмотрены шаги, которые вам необходимо выполнить для создания полиморфных объектов. Из урока 39 вы узнаете, как использовать исключительные ситуации в C++ для обеспечения надежности вашей программы. Прежде чем приступить к уроку 39 убедитесь, что вы освоили следующие основные концепции:

    1. Полиморфный объект может изменять форму во время выполнения программы.

    2. Вы создаете полиморфные объекты, используя классы, порожденные от существующего базового класса.

    3. В базовом для полиморфного объекта классе вы должны определить одну или несколько функций как виртуальные(virtual).

    4. В общем случае полиморфные объекты отличаются использованием виртуальных функций базового класса.

    5. Для создания полиморфного объекта вам необходимо создать указатель на объект базового класса.

    6. Для изменения формы полиморфного объекта вы просто направляете указатель на различные объекты, присваивая новый адрес объекта указателю на полиморфный объект.

    7. Чисто виртуальная функция — это виртуальная функция базового класса, для которой в базовом классе не определены операторы. Вместо них базовый класс присваивает такой функции значение 0.

    8. Производные классы должны обеспечить определение функции для каждой чисто виртуальной функции базового класса.

УРОК 39. ИСПОЛЬЗОВАНИЕ ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ C++ ДЛЯ ОБРАБОТКИ ОШИБОК

После того как вы создали и отладили (удалили ошибки) несколько программ, вы уже способны предвидеть ошибки, которые могут встретиться в программе. Например, если ваша программа читает информацию из файла, ей необходимо проверить, существует ли файл и может ли программа его открыть. Аналогично, если ваша программа использует оператор new для выделения памяти, ей необходимо проверить и отреагировать на возможное отсутствие памяти. По мере увеличения размера и сложности ваших программ вы обнаружите, что необходимо включить много таких проверок по всей программе. Из этого урока вы узнаете, как использовать исключительные ситуации C++ для упрощения проверки и обработки ошибок. К концу данного урока вы освоите следующие основные концепции:

  • Исключительная ситуация (exception) представляет собой неожиданное событие — ошибку — в программе.

  • В ваших программах вы определяете исключительные ситуации как классы.

  • Чтобы заставить ваши программы следить за исключительными ситуациями, необходимо использовать оператор C++ try.

  • Для обнаружения определенной исключительной ситуации ваши программы используют оператор C++ catch.

  • Для генерации исключительной ситуации при возникновении ошибки ваши программы используют оператор C++ throw.

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

  • Некоторые (старые) компиляторы не поддерживают исключительные ситуации C++.

C++ ПРЕДСТАВЛЯЕТ ИСКЛЮЧИТЕЛЬНЫЕ СИТУАЦИИ КАК КЛАССЫ

Ваша цель при использовании исключительных ситуаций C++ состоит в упрощении обнаружения и обработки ошибок в программах. В идеале, если ваши программы обнаруживают неожиданную ошибку (исключительную ситуацию), им следует разумным образом ее обработать вместо того, чтобы просто прекратить выполнение.

В программах вы определяете каждую исключительную ситуацию как класс. Например, следующие ситуации определяют три исключительные ситуации для работы с файлами:

class file_open_error {};  class file_read_error {};  class file_write_error {};

Позже в этом уроке вы создадите исключительные ситуации, которые используют переменные и функции-элементы класса. А пока просто поверьте, что каждая исключительная ситуация соответствует классу.

КАК ЗАСТАВИТЬ C++ ПРОВЕРЯТЬ ИСКЛЮЧИТЕЛЬНЫЕ СИТУАЦИИ

Прежде чем ваши программы могут обнаружить и отреагировать на исключительную ситуацию, вам следует использовать оператор C++ try для разрешения обнаружения исключительной ситуации. Например, следующий оператор try разрешает обнаружение исключительной ситуации для вызова функции file_соpy:

try

{     file_copy("SOURCE.ТХТ", "TARGET.ТХТ") ;  };

Сразу же за оператором try ваша программа должна разместить один или несколько операторов catch, чтобы определить, какая исключительная ситуация имела место (если она вообще была):

try

{     file_copy("SOURCE.ТХТ", "TARGET.ТХТ") ;  };

catch (file_open_error)

{     cerr << "Ошибка открытия исходного или целевого файла" << endl;     exit(1);  }

catch (file_read_error)

{     cerr << "Ошибка чтения исходного файла" << endl;     exit(1);  }

catch (file_write_error)

{     cerr << "Ошибка записи целевого файла" << endl;     exit(1);  }

Как видите, приведенный код проверяет возникновение исключительных ситуаций работы с файлами, определенных ранее. В данном случае независимо от типа ошибки код просто выводит сообщение и завершает программу. В идеале ваш код мог бы отреагировать и не так — возможно, попытаться исключить причину ошибки и повторить операцию. Если вызов функции прошел успешно и исключительная ситуация не выявлена, C++ просто игнорирует операторы catch.