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

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

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

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

Эту идею можно реализовать следующим образом: //передатчик с1авв Тгапвт111ег: рийк 01огаб!е ( риЫк. иоЫ кг11е ((, //приеиник с(авв Весе!пег. риЫк Иогаб(е ( риЫк; иоЫ кг11е ((, ); с1аввРай!о риЫкТгапвт1!гег,риЫккесе!иег( //радио риЫ!с. сопв1сба~ де! /ч!е((; иоЫ геас( (); иоЫ кгие ((, Ловольно часто замещавшая функция вызывает ее версию из базового класса и за- тем выполняет действия, специфичные для производного класса: 450 Глава 15. Иерархии классов ооЫ Рас11о. пегие () ( Тгапягп01егсьог!1е (); Ресе1иегсти!е (); //зались инфорлации, слеци4инной для радио ) Приведение из повторяющегося базового класса в производный класс обсуждается в З 15А.2.

Метод замещения каждой функции щг11е () отдельными функциями из производных классов см. в з 25.6. 15.2.4. Виртуальные базовые классы Пример с РаЖо из предыдущего подраздела работает, потому что можно безопасно, удобно и эффективно реплицпровать 51огаЫе. Часто этот подход не годится в случае классов, создаваемых в качестве строительных блоков для других классов. Например, мы могли бы определить ЯогаЫетакы!и образом, чтобы он содержал имя файла, используемого для хранения объекта; с!аья 3!огаЫе ( риЫк: З1огаЫе 1сопя1с!ьаг' я); оитиа! оо!д геас! () = О; от~па! ооЫ щгие () = О, о!г!иа!-51огайе () ( ипт1е (); ) ргта!е. соля1 слог' я!оге; З!огаЫе (соли 51огаЫе8).

З1огаЫеь, орега!ог= (сопя! Я!огайеь" ), ); Изменив 51огаЫе внешне незначительно, мы должны изменить подход к проектированию Райс. Все части объекта должны совместно использовать единственную копию 51огаЫе; в противном случае неоправданно сложно становится избегать хранения нескольких копий объекта. Одним из механизмов задания такого совместного использования является виртуальный базовый класс. Каждый виртуальный базовыи класс в производном классе представлен одним и тем же (совместно используемым) объектом. Папример: с1аяя Тгаляьл!!!ег. рийк игала!3!огайе( риЫ1с ооЫ вн1е (); с1аяя Весе!иег: риЫк Ыг1иа! в!ага йе ( риЫ1с; ооЫ щгйе (); //." ); с(аяя РаЖо риЫк Тгалилы!ег, риЬ!!свесе!пег( 451 15.2, Множественное наследование риЫ!с: иои! гиг!1е О, 0".

'е)ли в графическом виде: Вайо Сравните эту диаграмлсу с представлением объекта ЗагеП1!е в ч 15.2.3, чтобы увидеть разницу между обычным и виртуальным наследованием. В графе наследования все виртуальные базовые классы с одним именем будут представлены одним единственным объектом этого класса. С другой стороны, каждый невиртуальный базовый класс будет иметь отдельный подобъект, представляющий его. с1аяя В 1 риЫ)с: В !); 0 ...

// конструктор по унол канаю с1аяя С( рио!!с: С )!аф 1/ нет конструктора по умолчанию с!аяя 0 Ыг!иа! риЫ)сА, иг!иа! риЫ!с В, Ыг!иа! риЫ!с С В))!! " 'И Д оншбка; нет конструктора по улолканию длл С ЛУп!!).С)й(/*..."У), У/правильно 0". Конструктор виртуального базового класса вызывается до конструкторов производ- ных классов. 15.2.4.1.

Программирование виртуальных базовых классов Нрп определении функций класса с виртуальным базовым классом программист, в общем случае, не может знать, будет ли базовый класс использоваться совместно с другими производными классами. Это может представлять некоторую проблему при реализации алгоритмов, которые требуют, чтобы функция базового класса вызывалась ровно один раз. Например, язык гарантирует, что конструктор виртуального базового класса вызывается только один раз. Конструктор виртуального базового класса вызывается (явно или неявно) пз конструктора объекта (конструктора самого «нижнего» производного класса). Например: с!аяяА( О нет конопруктора Глава 15.

Иерархии классов При необходимости программист может смоделировать зту схему, вызывая функцию виртуального базового класса только из самого «нижнего» производного класса, Например, предположим, что у нас есть базовый класс %77пс7ощ который знает, как рисовать свое содержание: Кроме того, у нас есть различные способы оформления окна и введения дополни- тельных средств: Функции о!оп !!гав () не обязаны быть виртуальными, потому что предполагается, что они будут вызваны из виртуальной функции с! ат (), которая «знает» тип объекта, для которго она вызвана. Из этого мы можем создать вполне приемлемый класс С(осп Гчасы): с!аев С)осИ, риЫЫ Клгп«!от юг!И Ьог«7ег,риЫ!с%Маг!от илдй тели ( Д код, пл~еюгций отнотение к носил~ иоЫоилп дгат (); ,ллл отобразить циферблат и стрелки воЫ дгат (); Илн в графическом виде: %7пс(опл пл7й Ьогс7ег 3Ппс7от Ы7Ь тепи С!пей Теперь функции с(гав () можно написать с использованием функций оц п гтганл () та- ким образом, чтобы код, вызывающий любую «!гав (), косвенно вызывал при этом %7пс(овсг(тат () ровно один раз.

Это осуществляется независимо от типа окна %7пс(ов, для которого вызывается а! ат (): с!асс %7!адат ( О какой-то код о!ггиа! ооЫ дгат (); с(азз К!пдоил тоМИ Ьог«7ег: риЬ)!с пггиа! Кл!пс(ов ( О код, илеюи1ий отмен«ение крал~хе ооЫотп дгат(), ооЫ дгат (); с(аее%!одого тКИ тели риЬМсигг!ааl %йодов( // код, имеющий отношение к меню во!дота дгат (); »юЫ дгат (); ио!д %с!одого ил!гИ Ьог«7ег с!гаил () %7!пдот, Й ат (), О окно г рол~кой О отобразить рамку ЛЛ' окно с леденю О отобразить лиеню 453 15 2.множественное наследование отп йсат)) ссУ отобразить рамку иоЫ 1Гл!пйот т!ГЬ тепизйсаяо )) 1 1»'!пйот йсат )); отп йгаяи )), сс/ отобразсопь женю ио!й С!осй риЫ!с К!пйот тВЬ Ьогйесзйгаяо )) %7пйоел йгат )), 'йь!пйот ил!Ь Ьосйес..отп йсат )); 1Гс!пйот мвй теписояоп йгат )); отп йсат )), /сс отобразшпь циферблат и стрелка Приведение из виртуального базового класса в производньш обсуждается в 5 15.хк2.

15.2.5. Использование множественного наследования Простейшим и наиболее очевидным применением множественного наследования является «склеивание» двух никаким другим образом нс связанных классов вместе в качестве части реализаппн третьего класса. Класс. 5а1е!!!1е, созданный на основе классов Таей и сзйяр1адей в 5 15.2, является характерным примером.

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

Однако для того чтобы быть полезной, техника не обязана быть слишком «умной». Использование множественного наследования для реализации абстрактных классов является более фундаментальной задачей, которая оказывает воздействие на проектирование программы. Класс ВВ !па1 ядс!ег Я 12.3) может служить примером: с1аяяВВ Ыа! я1Ыст риЫ!с1иа! я!Ыег, !! интерфейс рго!ес1ейВВя1Ыег //реализалил 1! реслизаяил фуккпис1, требуемыхйза1 ябйеги ВВябйег // с использоеа кием средстпе, предостаеляелскх ЯВяб йес В этом примере два базовых класса с логической точки зрения играют совершенно различную роль. Один базовьш. класс является открытым абстрактным классом, обеспечивающим интерфейс, а другой — ваши!цепным конкретным классом, представляющим «детали» реализации.

Эти роли отражены и в стиле наименования классов и в предоставленном доступе. Множественное наследование в этом примере существенно, потому что производный класс должен заместить виртуальные функпии обоих классов — си интерфейса и реализации. 454 Глава 15. Иерархии классов Множественное наследование позволяет «братским« классам совместно использовать информацию без введения зависиьиости от единственного общего базового класса в проц>амме.

Это яв.ляется случаем так называемого ромбовидного наследования (например, !2айо (5 152 А) п С1ас/г (5 ! 52 А)). Впртуальныйз базовый класс в противоположность обыкновенному базовому классу требуется в тех случаях, когда базовыйй класс не должен повторяться. Я считаю ромбовиднос наследование хорошо управляемым в тех случаях, когда либо виртуальный базовый класс либо классы, производные непосредственно от него, являются абстрактными классами. В качестве примера рассмотрите ешс раз классы семейства авиа! Ьох из 5 12А. В конце концов, я сделал классы Ыа! Ьох абстрактными, чтобы отразить их чисто интерфейсную роль. Такое решение позволило мне поместить детали реализации в конкретные классы. Кроме того, совместное использование де~алей реализации было выполнено в форме классической иерархии оконной системы, использовавшейся при реализации.

Имело бы определенный смысл, если бы класс, реализующий Рорир !иа1 яИег, использовал большую часть реализации совместно с простым 1иа1 я!Ывг. В конце концов, эти классы реализации могли бы совместно ис»ользовать почти все, кроме обработки ввода от пользователя. Однако тогда представляется естественным исключить повторение объектов .(иа! яЬЫег в получающихся объектах, реализуюшцх ползунки ЫЫегя. Поэтому мы могли бы сделать|па! яРЫегвиртуальиым базовым классом: с!аяя ВВ !эа! ЫЫег: рибйв и!г!иа(Уэа! я!Ыег, ргогег(ег!ВВя!Ыег( Р ... */), г!аяя Рорир сиа! я!Ыег.

РиЫ!с э!г!иа! Иа! я!Ыег(1" ... *У й с!аяяВВ Рврир гиа! я!Ыег;риЫгвэ!г!иа!Рорир гиа! я!Ыег, рго!всгедВВ !иа! яРЫег(/*., '/ й или в графическом виде; Рарир Ыа( я!Ыег ВВ гаа! я1!дег ВВ рарир !ва! я1Ыег Легко представить себе производные от Рорир !иа1 я1Ыег интерфейсы и последуя>- щце классы реализации, производные от таких классов и ВВ рорир (ва1 я!Ыег.

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

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

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

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

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