Главная » Просмотр файлов » Г. Шилтд - Самоучитель C++ (PDF)

Г. Шилтд - Самоучитель C++ (PDF) (1114887), страница 46

Файл №1114887 Г. Шилтд - Самоучитель C++ (PDF) (Г. Шилтд - Самоучитель C++ (PDF)) 46 страницаГ. Шилтд - Самоучитель C++ (PDF) (1114887) страница 462019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 46)

Для реализации этого положения в C++ поддерживаются такназываемые чистые виртуальные функции (pure virtual function).Чистые виртуальные функции не определяются в базовом классе. Тудавключаются только прототипы этих функций. Для чистой виртуальнойфункции используется такая основная форма:virtual тип ямя^функцкя(списох_параметров) = 0;Ключевой частью этого объявления является приравнивание функции нулю.Это сообщает компилятору, что в базовом классе не существует тела функции. Если функция задается как чистая виртуальная, это предполагает, чтоона обязательно должна подменяться в каждом производном классе. Еслиэтого нет, то при компиляции возникнет ошибка.

Таким образом, созданиечистых виртуальных функций — это путь, гарантирующий, что производныеклассы обеспечат их переопределение.Если класс содержит хотя бы одну чистую виртуальную функцию, то о немговорят как об абстрактном классе (abstract class). Поскольку в абстрактномклассе содержится, по крайней мере, одна функция, у которой отсутствуеттело функции, технически такой класс неполон, и ни одного объекта этогокласса создать нельзя.

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

Это означает, что если производный класс используется в качествебазового для другого производного класса, то виртуальная функция можетподменяться в последнем производном классе (так же, как и в первом производном классе). Например, если базовый класс В содержит виртуальнуюфункцию f(), и класс D1 наследует класс В, а класс D2 наследует класс D1,тогда функция f() может подменяться как в классе D1, так и в классе D2.Примеры1.

Здесь представлена несколько усовершенствованная версия программы, показанной в примере 4 предыдущего раздела. В этой версии программы в базовом классе area функция getarea() объявляется как чистая виртуальнаяфункция.// Создание абстрактного класса^include <iostream>using namespace std;Глава 10. Виртуальные функцииclass area (double diml, dim2; // размеры фигурыpublic:void setarea(double dl, double d2)diml = dl;dim2 = d2;void getdim(double &dl, double &d2)fdl = diml;d2 = dim2;virtual double getareaO = 0; /V чистая виртуальная функцияclass rectangle: public area {public:double getareaOdouble dl, d2;getdim(dl, d2);return dl * d2;)};class triangle: public area (public:double getareaO{double dl, d2; getdim (dl, d2);return 0.5 * dl * d2;int main{)(area *p;rectangle r;triangle t;r. setarea (3.3, 4.5) ;t.

setarea (4.0, 5.0);p = &r;cout « "Площадь прямоугольника: " « p->getarea() « '\n';37531f>_СамоучительC++p = &t;cout « "Площадь треугольника: " « p->getarea() « '\n';return 0;Теперь то, что функция getareaQ является чистой виртуальной, гарантируетее обязательную подмену в каждом производном классе.2. В следующей программе показано, как при наследовании сохраняется виртуальная природа функции:/* Виртуальная функция при наследовании сохраняет свою виртуальнуюприроду*/^include <iostreara>using namespace std;class base {public:virtual void func(}{cout « "Выполнение функции f unc { ) базового класса \п";class derivedl: public base {public:void f unc ( ){cout « "Выполнение функции func() класса derivedl \n";// Класс derivedl наследуется классом derived2class derived2: public derivedl {public:void f unc ( ){cout « " Выполнение функции func() класса derived2\n";int main ( }Ibase *p;base ob;derivedl d_obl;derived2 d_ob2;Глава 10.

Виртуальные функции317р = sob;p->func(); // функция func() базового классар = &d_obl;p->func(); // функция func() производного класса derivedlр = &d_ob2;p->func(); // функция func() производного класса derived2return 0;В этой программе виртуальная функция func() сначала наследуется классомderivedl, в котором она подменяется.

Далее класс derivedl наследуется классомderived2. В классе derived! функция funcQ снова подменяется.Поскольку виртуальные функции являются иерархическими, то если бы вклассе derivedl функция funcQ не подменялась, при доступе к объекту d_ob2использовалась бы переопределенная в классе derivedl версия функцииfunc(). Если бы функция func() не подменялась ни в классе derivedl, ни вклассе derivedl, то все ссылки на функцию func() относились бы к ее определению в классе base.emiflj'правления1.

Проведите эксперимент с двумя программами из предыдущих примеров. Попытайтесь создать объект, используя класс area из примера 1, и проанализируйте сообщение об ошибке. В примере 2 попытайтесь удалить переопределение функции funcQ внутри класса derivedl. Убедитесь, что тогда действительно будет использоваться та версия функции func(), переопределение которой находится в классе derivedl.2. Почему нельзя создать объект абстрактного класса?3. Что произойдет в примере 2 при удалении переопределения функции func()из класса derivedl? Будет ли при этом программа компилироваться и запускаться? Если да, то почему?10.4. Применение полиморфизмаТеперь, когда вы знаете, как использовать виртуальные функции для реализации динамического полиморфизма, самое время рассмотреть, зачем этонужно. Как уже много раз в этой книге отмечалось, полиморфизм являетсяпроцессом, благодаря которому общий интерфейс применяется к двум илиболее схожим (но технически разным) ситуациям, т.

е. реализуется философия "один интерфейс, множество методов". Полиморфизм важен потому,318Самоучитель C++что может сильно упростить сложные системы. Один хорошо определенныйинтерфейс годится для доступа к некоторому числу разных, но связанныхпо смыслу действий, и таким образом устраняется искусственная сложность.Уточним: полиморфизм позволяет сделать очевидной логическую близостьсхожих действий; поэтому программа становится легче для понимания исопровождения. Если связанные действия реализуются через общий интерфейс, вам нужно гораздо меньше помнить.Имеются два термина, которые часто ассоциируются с объектно-ориентированным программированием вообще и с C++ в частности.

Этими терминамиявляются раннее связывание (early binding) и позднее связывание (late binding).Важно понимать, что означают указанные термины. Раннее связывание относится к событиям, о которых можно узнать в процессе компиляции. Особенноэто касается вызовов функций, которые настраиваются при компиляции.Функции раннего связывания — это "нормальные" функции, перегружаемыефункции, невиртуальные функции-члены и дружественные функции. Прикомпиляции функций этих типов известна вся необходимая для их вызоваадресная информация. Главным преимуществом раннего связывания (и доводом в пользу его широкого использования) является то, что оно обеспечиваетвысокое быстродействие программ. Определение нужной версии вызываемойфункции во время компиляции программы — это самый быстрый метод вызова функций.

Главный недостаток — потеря гибкости.Позднее связывание относится к событиям, которые происходят в процессевыполнения программы. Вызов функции позднего связывания — это вызов,при котором адрес вызываемой функции до запуска программы неизвестен.В C++ виртуальная функция является объектом позднего связывания.

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

Его основным недостатком является то, чтотребуется больше действий для вызова функции. Это обычно делает такиевызовы медленнее, чем вызовы функций раннего связывания.В зависимости от нужной эффективности, следует принимать решение, когда лучше использовать раннее связывание, а когда — позднее.Ниже представлена программа, которая иллюстрирует принцип "один интерфейс, множество методов". В ней определен исходный базовый класс длясвязанного списка целых.

Интерфейс списка определяется с помощью чистых виртуальных функций storeQ и retrieve(). Для хранения значения всписке вызывается функция store(). Для выборки значения из списка вызы-Глава10.Виртуальныефункции_319вается функция retrieve(). В базовом классе list для выполнения этих действий никакого встроенного метода не задается. Вместо этого в каждом производном классе явно определяется, какой тип списка " будет поддерживаться.В программе реализованы списки двух типов; очередь и стек. Хотя способыработы с этими двумя списками совершенно различны, для доступа к каждому из них применяется один и тот же интерфейс.

Вам следует тщательноизучить эту программу.// Демонстрация виртуальных функций^include <iostream>^include <cstdlib>#include <cctype>using namespace std;class list (public :list *head;list *tail;list *next;int num;////////указательуказательуказательчисло дляна начало спискана конец спискана следующий элемент спискахраненияlist () { head = tail = next = NULL; }virtual void store (int i) = 0;virtual int retrieve () = 0;// Создание списка типа очередьclass queue: public list {public:void store (int i) ;int retrieve ( ) ;>;void queue: : store (int i){list *item;item = new queue;if (! item) {cout « "Ошибка выделения памяти\пexit(l) ;1item->num = i;// добавление элемента в конец спискаif (tail) tail->next = item;tail = item;item->next = NULL;i f ( ! h e a d ) head = tail;320____int queue: : retrieve ())int i;list *p;if {! head) {cout « "Список пуст\п";return 0;// удаление элемента из начала спискаi = head->num;р = head;head = head->next;delete p;return i;// Создание списка типа стекclass stack: public list {public:void store (int i);int retrieve () ;void stack: :store (int i)list *item;item = new stack;if ( ! item) icout « "Ошибка выделения памяти\п";exit (1) ;}item->num = i;// добавление элемента в начало спискаif (head) item->next = head;head = item;if (Itail) tail = head;int stack : : retrieve ( ){int i ;list *p;if (! head) {cout « "Список пустХп";СамоучительC++Глава 10.

Виртуальные функции321return 0;1// удаление элемента из начала спискаi = head->num;р = head;head = head->next;delete p;return i;}int main(){list *p;// демонстрация очередиqueue q_ob;p = &q_ob; // указывает на очередьp->store(1);p->store(2);p->store(3);cootcoutcoutcout««««"Очередь: ";p->retrieve();p->retrieve();p->retrieve();cout « '\nr;// демонстрация стекаstack s_ob;p = Ss_ob; // указывает на стекp->store(l);p~>store{2);p->store (3);coutcoutcoutcout««««"Стек: ";p->retrieve();p->retrieve();p->retrieve ();cout « '\n';return 0;2.

Характеристики

Тип файла
PDF-файл
Размер
65,55 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6418
Авторов
на СтудИзбе
307
Средний доход
с одного платного файла
Обучение Подробнее