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

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

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

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

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

Конкретная реализация остается тем классам, которые наследуют класс агеа. В этом примере рассчитывается площадь треугольника и прямоугольника. 313 Глава 10. Виртуальные функции Р— аг; сосо « "Площадь прямоУгольника: " « р †>цаеагеа 1] « '~л'; р.= Йьг; соцс с< "пло|цадь треугольника: " с< р->цегагеа[1 сс геснгн 0; Обратите внимание, что определение яе1агеаО внутри класса агеа является только "заглушкой" и, в действительности, не выполняет никаких действий. Поскольку класс агеп не связан с фигурой конкретного типа, то нет значимого определения, которое можно дать функции яе1агеа() внутри класса агеа.

При этом, для того чтобы нести полезную нагрузку, функция яе1агеаО должна быть переопределена в производном классе. В следующем разделе вы узнаете об этом подробнее. 1. Напишите программу создания базового класса пшп. В этом классе должно храниться целое и определяться виртуальная функция вйотгппптО. Создайте два производных класса опйех и оп1ос1, которые наследуют класс пшп. Функция яйотгпшпо должна быть переопределена в производных классах так, чтобы осуществлять вывод на экран значений, в шестнадцатеричной и восьмеричной системах счисления соответственно. 2.

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

В производном классе ае1г(с переопределите функцию 1гат 1йпеО так, чтобы она выводила на экран время, необходимое для прохождения этого расстояния, считая теперь, что расстояние задано в километрах, а скорость равна 100 километров в час. 10.3. Дополнительные сведения о виртуальных функциях Как показано в примере 4 предыдущего раздела, иногда, когда виртуальная функция объявляется в базовом классе, она не выполняет никаких значимых действий.

Это вполне обычная ситуация, поскольку часто в базовом классе законченный тип данных не определяется. Вместо этого в нем просто содержится базовый набор функций-членов и переменных, для которых в производном классе определяется все недостающее. Когда в виртуальной Самоучитель С++ 314 функции базового класса отсутствует значимое действие, в любом классе, производном от этого базового, такая функция обязаииаьнодолжна быть переопределена. Для реализации этого положения в С++ поддерживаются так называемые чистые виртуальные функции (риге у(ттиа1~ипсГ(оп).

Чистые виртуальные функции не определяются в базовом классе. Туда включаются только прототипы этих функций. Для чистой виртуальной функции используется такая основная форма: ч~ефлза1 тип ими функцимсопвоох иарамевров) = О; Ключевой частью этого объявления является приравнивание функции нулю. Это сообщает компилятору, что в базовом классе не существует тела функции. Если функция задается как чистая виртуальная, это предполагает, что она обязательно должна подменяться в каждом производном классе. Если этого нет, то при компиляции возникнет ошибка. Таким образом, создание чистых виртуальных функций — это путь, гарантирующий, что производные классы обеспечат их переопределение. Если класс содержит хотя бы одну чистую виртуальную функцию, то о нем говорят как об абстрактном классе (аЫгасг с1ахг).

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

Это означает, что если производный класс используется в качестве базового для другого производного класса, то виртуальная функция может подменяться в последнем производном классе (так же, как и в первом производном классе). Например, если базовый класс В содержит виртуальную функцию 10, и класс 01 наследует класс В, а класс 02 наследует класс 01, тогда функция ГЦ может подменяться как в классе 01, так и в классе 02. м р"|' Е Здесь представлена несколько усовершенствованная версия программы, показанной в примере 4 предыдущего раздела. В этой версии программы в базовом классе агеа функция яегягеа() объявляется как чистая виртуальная функция. // Создание абстрактного класса 11пс1пбе <1оасгеат> оа1пя патпеарасе асс; Самоучитель р= аС.; соцс « "Плоз(адь треугольника: " « р->депагеа() « '~т' гесцгп О; Теперь то, что функция яе1агеа() является чистой виртуальной, гарантирует ее обязательную подмену в каждом производном классе.

!* Виртуальная функция при наследовании сохраняет свою виртуальную природу *у ()1пс1ийе <1оявгеалс цв1по папеврасе я й; с1авв Ьаве риЫ1с: чфггца1 чоЫ Хыпс() ( соцс « "Выполнение функции Гипс ( ) базового класса ~п"; )у соШ « "Вкполнение функции Еппс() класса йегьчей1 '~п"; с1авя йегфчей1: рыЫ1с Ьаве рцЬ11с: чоЫ1ипс ( ) Класс йег1чей1 наследуется классом йегфчей2 с1авв йегфчей2: рыЫ1с йегфчей1 ( риИ1с: чоЫХипс () ( соцк « " Выполнение функции басс() класса йег1чей2~п'; ) 1пвва1п () Ьаве *р; Ьаве оЬ; йегфчей1 й оЬ1р йеггчей2 6 оЬ2; 2.

В следующей программе показано, как при наследовании сохраняется виртуальная природа функции: 3)7 Глава 10. Виртуальные функции р = аоо; р->аппо(); уу функция тцпс() базового класса р =- ьг( о)з1р р >аппо(): уу функция Гцпс() производного класса оегтзев1 р = ас( о)з2; р->Гппс(); уу функция гцпс() производного класса с(ег1уеб2 гесигп О; В этой программе виртуальная функция гипс() сначала наследуется классом бег)тев1, в котором она подменяется.

Далее класс Нег!уе61 наследуется классом вег)уев2. В классе йепуей2 функция йвс() снова подменяется. Поскольку виртуальные функции являются иерархическими, то если бы в классе дептеЮ функция йшс() не подменялась, при доступе к объекту (1 оЬ2 использовалась бы переопределенная в классе вептев1 версия функции Бзпс(). Если бы функция гавел не подменялась ни в классе ()епте61, ни в классе (1епуе62, то все ссылки на функцию )ввсО относились бы к ее определению в классе Ьаве.

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

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

Имеются два термина, которые часто ассоциируются с объектно-ориентированным программированием вообще и с С++ в частности. Этими терминами являются Раннее связывание (вам Ыпйщ) и позднее связывание (1ате Ь~пйпд). Важно понимать, что означают указанные термины. Раннее связывание относится к событиям, о которых можно узнать в процессе компиляции.

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

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

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

Интерфейс списка определяется с помощью чистых виртуальных функций в1огео и гегг1ечеЦ. Для хранения значения в списке вызывается функция аГогеО. Для выборки значения из списка вызы- Глава 319 Виртуальные функции вается функция геФНеуе(), В базовом классе 1(з! для выполнения этих действий никакого встроенного метода не задается. Вместо этого в каждом производном классе явно определяется, какой тип списка" будет поддерживаться. В программе реализованы списки двух типов; очередь и стек. Хотя способы работы с этими двумя списками совершенно различны, для доступа к каждому из них применяется один и тот же интерфейс. Вам следует тшательно изучить эту программу.

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

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

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

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