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

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

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

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

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

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

Например. концепции круга и треугольника связаны — они являются фигурами; то есть концепция фигуры является общей для них. Поэтому мы должны явно определить, что классы Сггсге (круг) н?)тапд!е (треугольник) имеют общий класс Яйаре (фнгура). Представление круга и треугольника в программе без введения понятия «фигура» означюзо бы потерю чего-то суп!ественного. В этой главе тщательно выясняются следствия этой простой идеи, которая является основой так называемого объектно-ориентированного программирования.

Глава! 2. Производные классы 350 12.2. Производные классы Допустим мы создаем программу, обрабатывающук> информацию о сотрудниках (ешр)оуее) фирмы. Для ~акой программы может понадобиться следующая структура: Игисг Етр!о усе ( е1гспу!сге1 пате,дат!!у пате, сваг т!с!д!е т!йа1; Оа1е !пмпу с!а1е, елог1 с!ераг1теп1, Затем мы можем попытаться определить менеджера: е1гис1 Мападег ( Етр!оуее етр, ее1«Етр!оуее*> угоир, е!1ог1 !еое1, О сведения о менеджере как о сотрудни ке Оподчиненние 0- ), Менеджер также является сотрудником; соответствующие данные хранятся в члене егпр объекта Мападег.

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

Мы представляем средства языка и соответствующие техники программирования в порядке от простого и конкретного к более изощренному и абстрактному. Деи многих программистов это также будет означать движение от хорошо знакомого к менее знакомому. Это пе просто путешествие от «старых плохих методов» к «единственно правильному способусь Когда я указываю на ограничения одного метода, чтобы оправдать переход к другому, я делаю зто в контексте конкретных проблем; для друп1х задач первый метод может оказаться наилучшим. С помощью всех упоминающихся здесь методов было написано вполне работоспособные и полезные программы.

Напча цель состоит в том, чтобы помочь вам понять суть этих методов, дабы сделать разули ный и сбалансированный выбор для реальных проблем. В этой главе я сначала опишу базовые средства языка для поддержки объектно-ориентированного программирования. Затем использование этих средств для проектирования хорошо структурированных программ будет проанализировано на «болыном» примере. Другие средства поддержки объектно-ориентированного программирова,ния, такие как множественное наследование и определение типа во время выполнения, обсуждаются в главе 15. 351 12.2.

Производные классы 81тис1Мапаует рибус Етр!оуее ( зе1<Етр!иуее"> дтоир; збот! 1еие1, 0 ); Класс Мападег является произеодиьси от Етр!оуее, а Етр1оцее является базоеьси классогя для Мападег. Класс Мападег кроме своих собственных членов (угоир, 1еие1 и т, д.) содержит члены класса Етр1оуее 1д!тч1 пате, г!ераг1теп1и т. д.). Такое отношение между классамн часто представляют в графическом ниде при помощи стрелки, указывающей пз производного класса в базовый, тем самым производный класс ссылается па базовый (а не наоборот): Етр1оуее Мапауег Часто говорят, что проиаводный класс наследует свойства базового, поэтому их отношения нередко называют ниследоеаниель Базовый класс иногда называют суперклассом, а производный — подклассом. Однако подобная терминология вводит в заблуждение людей, которые загиечают, что данные в объекте производного класса являются надмножеством данных базового класса.

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

Например: Етр1оуее Мападег Ягз1 пате гат!1у пате ВыводМапауегизЕтр1оуеетаким образом делает Мапауег подтипомЕтр!оуее. Следовательно обьсктом типа Мападег можно пользоваться везде, где допустим Етр1оуее. Например, мы можем создать список сотрудников Етр1оуее, некоторые пз элементов которого будут иметь тип Мападег. иоЩ(Малюет т1, Етр!оуее е !( !!з! .Етр1оуее*' е1га1; е1!зг.риаб ~топ! (бип1(, ей1 ризб 3топ1 (йе!(, Мападег является Етр(оуее, поэтому Мапауег' можно использовать как Етр1оуее'.

Однако Етр!оуее пе обязательно Мападег, поэтому Етр!оуее' нельзя использоват~ Глава 12. Производные классы 352 иоЫ у(Мапауег тт, Етр!оуее ее) ( Етр!оуее" ре = Йтт; 11 правильно: ко>сдай Мапидег )! является Етр)идее э'ээ ошиока: нв каждой Етр!оуее // является 6!алидег Мапауегл рт = бее, 1! каэписэпросра: д переленной рт нет !еое! ргп — >1еое1 = 2, ргп = в!анс савг<Мапауе~ "> (ре); Огрубия аио: ре указывает О на переменную тт клогги Мвпидег !э' прекрасно: рт дкпзьэвиет /! на перененную тгп класса Мипадег, Од которой есть !еоеl, рт->!еое! = 2; Другими словами, с объектом производного класса можно обращаться как с обьектом базового класса при обращении к нему при помощи указателей и ссылок, Обратное неверно.

Использование в!а!!с сав! и с(упат!с сав! обсуждается в Э 15.4.2. Использование класса в качестве базового эквивалентно объявлению (неименованного) объекта этого класса. Следовательно, для того чтобы класс можно было использовать в качестве базового, он должен быть определен Я 5.7): О ~польки ооъявление (без определения) с1авз Етр1одее; с!авв Мапидег ридйс Етр!оуее ( // ошибка: Етр!оуее не определен 0- ), 12.2.1. Функции-члены Простые структуры данных, такие как Етр1оуее и Мапауег, как правило нс представляют большого интереса и не особенно полезны. То что нам требуется — это представление информации в виде подходящего типа с соответствующим набором операций, отражающих концепцию. Мы хотим это сделать, не внцкая в детали конкретной реализации.

Например: с1азв Етр1оуее ( и!гтд Вгв! пате,~ат!!у пате; сЬаг тиЫ!е нила!, О" риЫ!с. иои! рпп! () сопя!; всг!пу)и11 пате () сопя! ( ге!игл Вгзс пиэпе + ' ' + т!с!д!е !и!!!а! + " +Хат!!д пате, ) в качестве Мапауег*. В общем, если производный класс Вег!оед имеет в качестве ба- зового открытого класса Я 15.3) Ваке, то !)ег(оес(* может быть присвоен переменной типа Вазе* без явного преобразования типа. Обратное преобразование из Вазе* в !лег!пес(' должно быть явным.

Например: 353 12.2. Производные классы с!аееМапауег; риЫссЕтр1оуее( О.. риЫ1с: ооМ ргсп1 () сопе1; Член производного класса может пользоваться открытыми (и защищенными, см. 3 15.3) членами оазового класса так, как будто они объявлены в самом производном классе. Например: ооММапауеггрпп1()сопе1 сои1 « "Имл: «уи11 пате()«",и', 0- Однако пронзводный класс не может использовать закрытые имена базового класса: оои(Мапауег ргеп1 () сопе1 сои1« "Имя: <1ат11у пате« "~п'; ))ошибка! 0 ... // печать инфорчауии о сонруднике /1' печать инфоряапии, относящеися только к менеджеру Етр!оуеесрпп1 (); сои1 «1еое1; Обратите внимание, что должен использоваться оператор::, потому что рпп1 () была замещена в Мападег. Такое повторное использование имен является типичным.

Оп- рометчивый человек мог бы написать: Вторая версия Мападегзрг1п1 () не будет откомпилирована. Члены производного класса не имеют специального разрешения на доступ к закрытым членам их базовых классов, поэтому к~ат11у пате нельзя обращаться из Мапайегсрпп1 (). Для некоторых это является сюрпризом, но давайте рассмотрим альтернативный полход: функция-член производного класса может осуществлять доступ к закрытым членам базового. Концепция закрытых членов стала бы бессмысленной, если бы мы позволили программисту получить доступ к закрытой части класса, просто создав на его основе новый класс. Более того, невозможно будет найти все случаи непользования закрытого имени путем просмотра функций-членов и функций-друзей класса.

Пришлось бы проверить все файлы исходных текстов программы в поисках производных классов, затем проверить все функции в этих классах, затем найти все производные от этих классов и т. д. Это, в лучшем случае, утомительно, а час~о и просто нереально. Там, где это приемлемо, можно воспользоваться защищенными членами вместо закрытых. Защищенный член ведет себя как открытый по отношению к члену производного класса и как закрытый по отношению к лругим функциям (см. 4 15.3), Как правило, самым понятным решением является использование в производном классе только открытых членов его базового класса. Например: .еоиуМапауегэрпп1() сопе1 354 Глава г2.

Производные классы оо!гГМапауегзрпп1 () сопя! рнпГ (); ! / не ого н г О печать информации, относящейся гполько к менеджеру что неожиданно повлекло бы последовательность рекурсивных вызовов. 12.2.2. Конструкторы и двструкторы Некоторые производные классы нуждаются в конструкторах. Если базовый класс имеет конструктор, он должен быть вызван. Конструкторы по умолчанию могут быть вызваны неявно. Однако если все конструкторы базового класса требуют указания аргументов, то конструктор этого базового класса должен быть вызван явным образом. Рассмотрим: с1аии Етр1оуее ( яГг!пуЯгя1 пате,~ат!!у пате; и!гогГ дераг1т ел 1; //," риЬйс: Етр1оуее (сопя1 игггпуй и, !пг г(), с1аяя Мапауег: риЬЕс Етр!оуее ( яе1<Етр!оуее"ь угоир; // подчиненные идогГ 1еие1, О.. риЫгс: Мапауег (сопи1 я1г!пуй и, гпг гГ, !п1 !иГ); Аргументы конструктора базового класса указываются в опрелелении конструктора производного класса.

Б этом отношении базовый класс ведет себя как член производного класса (з (ОА.6), Например: Етр!оуеесЕтр!оуее (сопя1 игг!пуй и, гп1 г(): йатг!у пате (п),г(ераггтеп1 г11) //инациилизагтя членои ( 0- ) Мапауег Мапауег(сопя! и1Ппуй и, !пГ гГ, гп1 Ы): Етр!оуее(п,д), //инициализация базового к.гасса !еие! (Ы) // иницитшзация членои ( //- Конструктор производного класса может указать инициализаторы для своих собственных членов и членов базового класса; он не может непосредственно инициализировать члены базового класса. Например: 355 12.2. Производные классы Мапауел;Мапауег (сопя! з!гглуй и, (п! д, 1л11о(): /ат!1у пате (л(, //ошибкаь/атйу пате не объявлен вМапиуег с(ераг!теп! (д(, // оьиибка: дераг!теп! не объявлен в Мапауег 1еое1(1о(( (//..

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

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

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

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