Главная » Просмотр файлов » Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004

Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 101

Файл №1160791 Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004) 101 страницаБ. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791) страница 1012019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Обратите внимание, что все эти возражения не имеют большого значения для защищенных функций; защищенность — это прекрасный способ задания операций для использования в производных классах. Хорошим примером может служить Ьа! в!Ыег пз 5 12.4.2. Если бы в этом примере класс реализации (точнес, его функцпн) был закрытым, дальнейшее создание производных классов было бы невозможно. Примеры, иллюстрирующие доступ к членам, можно найти в 9 В.11.1.

460 Глава 15. Иерархии классов 15.3.2. Доступ к базовым классам Аналогично членам класса базовый класс можно объявить закрытым (рпса1е), защи- щенным (рг о1ес1ег)) или открытым (риЫ)с). Например: с)аззХ риЫ!сВ( /' ... '/), с1озз г рго1есгедВ(/ ... /); с)аззХ рг)оа1еВ(/" ... "/); Открытое наследование делает производный класс подтипом базового; это наиболее распространенная форма наследования.

Защищенное и закрытое наследование используются для выражения деталей реализации. Защищенные базовые классы полезны в иерархиях классов, в которых дальнейшее построение производных классов является нормой. Хорошим примером может служить /са! зЫегпа Ь 12А,2. Закрытые базовые классы полезны в основном при определении класса, который предоставляет большие гарантии, чем его базовый класс, как бы «ужесточая > интерфейс базового класса. Например, шаблон класса вектора пз указателей Уесгог добавляет проверку типа к своему базовому классу Уес1ог<соЫ*> Я 13.5).

Кроме того, если мы хотим убедиться, что проверяется каждый случай доступа к Уес Я 3.7.2), мы дол кны определить базовый класс Уес закрытым (для предотвращения преобразования Уес в непроверяемый базовый класс): 1етр1а1е<с1азх Т с!азз Уес: рлраге иес1огх7 1/'... '/); // вектор с ироверкод вьмода //зо диалазол // — зок/юрлов наследоаотш // — о нргхтое лпгле))оеалне Чтобы сделать код более читаемым, лучше использовать явный спецпфпкатор. Спецпфпкатор доступа к базовому классу управляет доступом к членам базового класса и преобразованием указателей и ссылок из типа производного класса в тпп базового класса.

Рассмотрим класс Р, производный от базового класса В: Если В является закрытым базовым классом, его открытые и защищенные члены могут быть использованы только функциямц-членами и друзьями Р. Только друзья и члены Р могут преобразовать Р* в В*. Если В является защищенным базовым классом, его открытые ц защищенные члены могут быть использованы только функццямп-членамп и друзьями класса Р и его производных классов.

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

Любая функция может преобразовать,0' в В". Это в основном является переформулировкои правил для доступа к членам (5 15.3). Мы выбираем способ доступа к базовым классам из тех же соображений, что п для членов. Например, я предпочел сделать ВВш)пЫош защищенным базовым классом для Спецификатор доступа может быть опущен. В этом случае базовый класс по умолчанию будет закрытым для производного класса и открытым для производной структуры. Например: с)аззХХ В(/*- '~ ). 1И' В(/ ...*/), 461 15.3. Управление доступом 15.3.2.1. Множественное наследование и управление доступом Если доступ к имени или базовому классу может быть осуществлен при помощи нескольких путей в решетке классов с множественным наследованием, то доступ разрешен только в том случае, если он разрешен по каждому из возможных путей.

Например: зггисг В ( гпгт; Ыалг гп! зт, с1авв.01 риЫ|с о!ггиа1В ( гг*... 'гг); с1аззР2 риы!св(ггиа(В(1*... ",1); с1 азз 1Ю р и Ы| с Р!, рггва 1е Р2 ( гг* ... ",г ); 1Ю* рд = пеги РР, В*рб=рд; т1В =р|1->т; О правильна: доступ перез 01 гггг правильно: доступ перез Р ! Даже если доступ к некоторой сущности может быть осуществлен несколькими спо- собамн, тем не менее на нее можно в принципе ссылаться без появления неоднознач- ности.

Например: С!авв Х! риЬВГ В ( гг' ... 'гг ); с1азвХ2 риЫ|сВ( гг' ... *гг)' с(аввХХ риы(сХ1, риЫ1сХ2 ( г'" ... 'г'); ХХ рхх= пегсХХ; гггг ошибка, неоднозначность| ХХ||Х1 | |В| гпг или ХХ|:Х2: Внт гггг правильна: в ХХ есть только один В: ггип т1|'1 =рхх — >т; гп1|2 =рхх->зт, 15.3.2.2. пв1пд-обьнвления и управление доступом ив(ггй-абьявлениг не может быть использовано для получения доступа к дополнительной информации, Оно является механизмом предоставления уже доступной ни|формации в более удобном для использования виде. С другой стороны, если доступ к информации имеется, сто можно предоставить и другим пользователям. Например: !оа1 в1111ег (гг 12.4.2), потому что ВВы(пс(ои является частью реализации Гиа( в1гг(ег, а не частью его интерфейса.

Однако я не мог полностью скрыть ВВш(пг1ош, сделав его закрытым базовым классом, потому что я хотел оставить возможность дальнейшего построения классов, производных от 1па1 в1(с(ег, и зтим производным классам потребоватся бы доступ к реализации. Примеры, иллюстрирующие доступ к базовым классам, можно найти в з В.11.2. Глава 15, Иерархии классов 462 1пс с; сЕазз В; риЬЕ(с В ( рибаа из(пдВза; из(ад В: Ь; О ошибка; Вка закрыт О Внб сгппновття обтедоступныя нерея О Комбинации ив(пд-объявления с закрытым или защищенным наследованием можно использовать для предоставления только части интерфейса, предлагаемого классом. Например: О првдосп~авляет доступ к В::Ь и Впс, но не к В::и с1азв ВВ: рггса!е В ( итпуВзЬ; итпдВзс; См. также Ч 1;к2.2.

15.4 Информация о типе на этапе выполнения оо1сЕ ту ввел! Ьапд!ег (ВВвяпс(от* рхо( ( ,Е,?рт указывает нв Евв1 Ьоя? Ц' (Еса! Ьок'рб = булат(с вас!<На! Ьвх'» (рт(( рЬ-»до зотеЕЬЕпд ((; в(зе ( ЕЕ Проблеял ~ Неожиданное сооытне Происходящее можно обьяснить следующим образом: с(упат(с сав! переводит с языка системы пользовательского интерфейса на язык приложения. Обратите внимание Вероятным использованием семейства классов $оа1 Ьох, определенных в ~ 12А, будет передача их в сне~ему, управляющую экраном, которая передаст зти объекты обратно в программу при наступлении некоторого события.

Так работает множество пользовательских интерфейсов. Однако система пользовательского интерфейса не знает ничего о нашем семействе Еоа1 Ьох. Интерфейсы системы задаются в терминах классов и объектов системы, а не в терминах классов нашего приложения. Так оно и должно быть. Однако зто имеет неприятный побочный аффект, заключающийся в том, что мы теряем информацию о типе объектов, переданных системе и затем возвращенных пам. Восстановление «потерянного» типа объекта требует, чтобы мы могли каким- либо образом спросить объект о его типе. Прн любой операции нал объектом нам требуется указатель пли ссылка подходящего типа. Следовательно, наиболее очевидной и полезной операцией по определению типа объекта на этапе выполнения является операция преобразования типа, которая возвращает корректный указатель, если объект имеет ожидаемый тпп, и нулевой указатель — в противном случае.

Оператор с!упит!с сав! именно зто н делает. Например, предположим, что всистема» вызывает обработчик ту впеп1 Баас(1ег() с указателем на то окно ВВш!пс(ош, где произошло некоторое событие. Я затем мог бы вызвать некоторый код в моем приложения, например с использованием функции с(о вате!ЬЕпй (( класса !па! Ьох: 463 15.4. Информация о типе на этапе выполнения на то, что в примере явно нв указан лействительный тип объекта. Объект будет иметь тип одного из классов сегвейства Тиа1 Ьох, скажем Тоо1 в1Ыег, реализованный одним из видов ВВв!пт(ош, например, ВВв1Ыег.

Не является необходимым, да это и нехтелательно, делать действительный тип объекта явным во взаимодействии между «системой» и приложением. Интерфейс существует лля представления существенных моментов взаимолействия. В частности, хорошо спроектированный интерфейс скрывает несущественные летали. Графически, действие р6 = т1улатптс сев!<!ил! 6вх" > (ат! можно представить слелуюшим образом: рш —. ----- ВВш1пт1ош Тиа1 Ьох ------- рЬ ВВв1Ыег 1иа1 в1Ыег ВВ 1иа1 в1Ывг 15.4.1. Динамическое приведение с(упатп!с свв1 Оператор т(упит!с сав! имеет два операнда: тип, заключенный в угловые скобки, и указатель (или ссылка), заключснньш в круглые скобки.

Сначала рассмотрим случай с указателем; т!улатгс сав! Т*> ф Если р типа Т * пли типа Р*, где Т является базовым классом лля Р, результат будет точно такой же, как прп простом присваивании р указателю типа Т *. Например: с$аввВВ та! в!!т!ег. ри6!!стив! в!Ыес ртатестед ВВв!!тгег( /! иаттЦ!ВВ гиа! в!тт!вг* р) Хиа! и!Ыег*рт! =р; Тиа! вйиег*ртй = т!улит!с савт<уиа! и!Ыег"> !р); г'т' лрави тно 0 лравюьвно Стрелки от рш и рЬ представляют указатели на передаваемый объект, а остальные стрелки представляют отношения наследования между различными частями передаваемого объекта. Использование информации о типе во время выполнения обычно называют «информацней о типе на этапе выполнения» или сокращенно.

КТТ1 (Кпп-Типе Туре 1п1оттпаг! оп). Приведение пз базового класса в производный часто называтот понижаюи!им приведвниелт (до»нпсазг), потому что принято изображать дерево наследования растущим вниз из корня наверху. Аналогичным образом, приведение из производного класса в базовый называют павы юаюи!ил! приввденгтвт (прсазй), Приведение между производными классами олного базового класса называют пврвкрвстньсм приведением (стоззсазг). Глава 15. Иерархии классов 464 ВВя!Ыег' рЬЬ1 = р, // ошибка ВВя(Ыег — эаи(!и!1еннь!и' баэовьш класс ВВя1Ыег*рЬЬ2 = с1упатк сая1кВВя(Ыею > ф; //правильно! РЬЬ2 станет 0 ), с!аяяМу !(а1е риЫ!сйа1е1 //базовый класс не полилорфен // (у Ва1е нет вор туольнмх функииь!) ооЫ д(йеа! Ьох* рЬ,Вп1е" ргй Му я!Ыег*рс(1 = бупатЫ саягкМу я1и1ег'> (РЬ) Му !1а1е" рб2 = булат!с спз(кМу ь(аге*> ~рс(!б (,' и!зови 7»но О огиибка! Ва!е— // не полилорфнии !пип Требование, что тип указателя должен быть полиморфным, упрощает реализацию с(упит!с сая1, потому что в этом случае легче найтц место для хранения необходимой информации о типе объекта.

В типичной реализации <объект, содержащий информацию о типе» будет добавлен к самому объекту путем помещения указателя на информацию о типе в таблицу виртуальных функций объекта Я 2.5.5). Например; Му я1Ые! о161 1уре !'и/о базовые 1уре !пФ классы *Му я(Ыег":="'" 7оа! я11йег" Этот случай не представляет интереса. Однако утешительно сознавать, что с(упит(с спя1 ие допускает случайных нарушений правил доступа к закрытым и ваши!пенным базовым классам.

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

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

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

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