![]() |
|
Программирование >> Расширенная версия языка c++
Ниже представлена которая иллюстрирует принцип один ин- терфейс, множество методов . В ней определен исходный базовый класс для связанного списка целых. Интерфейс списка определяется с помощью чистых виртуальных функций store() и retrieve(). Для хранения значения в списке вызывается функция storeO- Для выборки значения из списка вызы- что может сильно упростить сложные системы. Один хорошо определенный интерфейс годится для доступа к некоторому числу разных, но связанных по смыслу действий, и таким образом устраняется искусственная сложность. Уточним: полиморфизм позволяет сделать очевидной логическую близость схожих действий; поэтому программа становится легче для понимания и сопровождения. Если связанные действия реализуются через общий интерфейс, вам нужно гораздо меньше помнить. Имеются два термина, которые часто ассоциируются с объектно-ориентированным программированием вообще и с C++ в частности. Этими терминами являются раннее связывание (early binding) и позднее связывание (late binding). Важно понимать, что означают указанные термины. Раннее связывание относится к событиям, о которых можно узнать в процессе компиляции. Особенно это касается вызовов функций, которые настраиваются при компиляции. Функции раннего связывания - это нормальные функции, перегружаемые функции, невиртуальные функции-члены и дружественные функции. При компиляции функций этих типов известна вся необходимая для их вызова адресная информация. Главным преимуществом раннего связывания (и доводом в пользу его широкого использования) является то, что оно обеспечивает высокое быстродействие программ. Определение нужной версии вызываемой функции во время компиляции программы - это самый быстрый метод вызова функций. Главный недостаток - потеря гибкости. Позднее связывание относится к событиям, которые происходят в процессе выполнения программы. Вызов функции позднего связывания - это вызов, при котором адрес вызываемой функции до запуска программы неизвестен. В C++ виртуальная функция является объектом позднего связхвания. Если доступ к виртуальной функции осуществляется через указатель базового класса, то в процессе работы программа должна определить, на какой тип объекта он ссылается, а затем выбрать, какую версию подменяемой функции выполнить. Главным преимуществом позднего связывания является гибкость во время работы программы. Ваша программа может легко реагировать на случайные события. Его основным недостатком является то, что требуется больше действий для вызова функции. Это обычно делает такие вызовы медленнее, чем вызовы функций раннего связывания. В зависимости от нужной эффективности, следует принимать решение, когда лучше использовать раннее связывание, а когда - позднее. вается функция В базовом классе list для выполнения этих дейст- вий никакого встроенного метода не задается. Вместо этого в каждом произВОДНОМ классе явно определяется, какой тип спискабудет поддерживаться. В программе реализованы списки двух типов; очередь и стек. Хотя способы работы с этими двумя списками совершенно различны, для доступа к каждому из них применяется один и тот же интерфейс. Вам следует изучить эту программу. Демонстрация виртуальных функций #include <..;.ojLream> ttinclude <cstdlib> * . , , . #include <cctype> ... using namespace std; class list ( public: lis ad; указатель на начало списка lis il; указатель на конец списка lis xt; указатель на следующий элемент списка число для хранения list () { head = tail = next = NULL; virtual voi (int i) = 0; virtual in eveO = 0; Создание списка типа очередь .. class queue: public list { / public: void store(int i) ; int retrieve( ) ; voi store (int i) list *item; . .. item = new queue; if (litem) { cou Обка наделения памятиХп ; exit(l); item->num = i; добавление элемента в конец списка if(tail) tail->next = item; tail = item; item->next = NULL; if(!head) head = tail; . . . : i 320 Самоучитель . c++: in retrieve () j .- : . - .. -; int i; . . . - : list *p; . . -. . T W !. . . if{[head) { cout Список пуст\п ; return 0; ). удаление элемента из начала списка i = heaa->num; р = head; head = head->next; delete p; return i; Создание списка типа стек class stack: public list { public; void store (int i); void list item = new stack; if ( ! item) { cou Сбка выделения памяти\п ; exit (1); = i; добавление элемента в начало списка if (head) item->next = head; head item; ail) tail = head; int { int i ; list ifdhead) { cou Ссок пустЧп ;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |