Главная » Просмотр файлов » Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002)

Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 88

Файл №1160801 Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002)) 88 страницаТ. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801) страница 882019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Примером этого является конструкция с! азз в языке С++. Если между классами Я и В установлено отношение, которые можно записать как А =» В, то некоторые объекты класса А будут неявным образом унаследованы и могут быть использованы в классе В, Если некоторый объект Х объявлен в классе А и не переопределен в классе В, то любая ссылка на объект х внутри класса В в силу наследования фактически является ссылкой на объект Х из класса А, что аналогично ссылке на переменную ! в приведенном выше примере из языка С. Если между классами А и В определено отношение А ~ В, то говорят, что класс А является родительским классом, или суперклассом, а класс  — зависииым, или дочерним, классом, или подклассом.

Класс А является прямым предком, или родителем класса В. На рис. 7.2, а класс А является прямым предком для классов В и С, которые друг для друга являются ближайшими родственниками одного «!токоления». Классы В и С являются прямыми потомками класса А, тогда как класс 0 является просто потомком класса А. Если некоторый класс имеет только одного родителя, то такое наследование называется простым. Если же класс имеет нескольких родителей, то такая форма наследования называется множественной. Ч Рис. 7ли Наследование: е — простое; б — мне!кестеенное Множественное наследование допустимо в С++, но не в бана.

Б языке Ада 95 добавлены помеченные (гаййед) типы, реализующие форму наследования, при которой объекты, объявленные как та99еб рщ нате, могут быть использованы в новом пакете с дополнительными компонентами. Ниже приводится несколько примеров: туре Са1епбаг та тадреб рг!уа1е; рт тате туре Са!епбаг !а тарреб гесогб вау; !стерег: яспгп: !стерег; епб гесогб 7.2. Наследование 313 и Гуре Аппоа10а1епоаг аа пав Од1еппаг ч1ть гесого чеаг дпгецег. епа гесога 7.2.1.

Производные классы Классы в языках, подобных С++, цана и Япдайтай, тесно связаны с концепцией инкапсуляции. Обычно класс состоит из двух частей: одна может быть унаследована каким-либо другим классом, а другая остается скрытой от внешних воздействий и используется только внутри этого класса. Например, стеки целых чисел в Аоа (см.

листинг 7.4) могут быть представлены в С++ как с1адд дпддгасд (ргачате дпг юге; апт а1огаце(100). ) нли в(ана с1 ада д п1д1д сд (рычаге дп( юге: )пг (1 д1огаце = печ дпг(1001. Имя д 0101ас~ — зто имя класса, известное за его пределами, в то время как объявления переменных 01ге и ООогдцЕ, следующиЕ за мОДифиКатОРом переменных Рш чдОе, как и в языке Аг(а, представляют собой компоненты класса )пса Ьас1, которые известны только внутри класса. В понятие абстракции типа данных, как говорилось выше, входят и описания данных, и функции, которые могут оперировать данными этого типа. Такие функции часто называются методами. Более полное описание класса дп(зЬдс1, в который включены методы, могло бы выглядеть следующим образом: с1д55 дп151дсп (рощ1с.

дпгдтасд() (юга=0.) чшо роЖдпт д) ( дгогаце(юге+ 1-н) дпг РоР,. рг)чана: дп1 юге; дп( дтогаце(100): ) Модификатор риЬ))с означает, что соответствующие имена видимы за пределами определения класса и могут быть унаследованы другими классами. Входящая в определение класса функция д пса1асд (), имя которой совпадает с именем класса, является специальной функцией, называемой консшрухтлором, и вызывается каждый раз, когда создается объект этого класса. В данном случае эта функция инициализирует пустой стек, но, вообще говоря, она может выполнить любой код инициализации, необходимый для создания объектов этого класса. В этом примере функции розЬ и рор могут быть вызваны и использованы за пределами определения класса как методы объектов класса д пЬОЬдс1, например Ь.

рсзЬ(1) или 0 = Ь. рор() для стека Ь. Имена з)те и з Ьогаце, напротив, известны только в пределах определения класса. 314 Глава 7, Наследование Для уничтожения обьекта класса зпЬз[асЕ и высвобождения занимаемого им места в памяти следовало бы определить специальную функцию -зп[з[асЕ, которая называется деструктором. В приведенном примере деструктор не нужен.

Но если бы конструктор отводил в памяти какое-то дополнительное место, требуемое для объектов класса, то деструктор был бы необходим для его освобождения впоследствии. Запись Ь.розп[7) не так уж необычна, как может показаться на первый взгляд. Определения классов похожи на определения типов в языке С, за тем исключением, что в определение класса входят еще и компоненты-функции, манипулирующие объектами этого класса.

Таким образом, Ь розп — это компонент-функция розп объекта Ь. Сходство а!ежду понятием класса в С++ и) ага и конструкцией згосг в языке С не является случайным. Объявление в языке С агьвст Я (зп( В)— это просто сокращенная запись объявления С++ с!ааа А (рнЫ Зс: зпт В) В определение класса, таким образом, могут входить и определения функций, и определения данных. Наследование в)ага и С++ происходит прн помощи яроизаодззь?х классов. Например, один класс может содержать объекты типа е]ев, а в другом классе эти обьекты могут использоваться для создания стеков, как показано в листинге 7.6. Имя Е]евЕЬасЕ, которое следует за ключевым словом с1азз, представляет производный класс, а имя, непосрелственно следующее задвоеточ нем после имени класса Е1ев5?асх, обозначает базовый класс [имя е1ев).

[В языке )ага для указания базового класса вместо лвоето !ня используется ключевое слово ехгепЬз ) Если рассматривать операциии класса просто как компоненты определения объектов этого класса, то понять синтаксис достаточно легко. Запись х.ТоЕ)ев[...) становится ссылкой на метод, определенный в классе е1 ев, в результате которой вызывается процедура То[1ев, неявным аргументом которой является объект х. Листинг 7.6. Производные классы в С++ с1ааа е1ев З рзЫзс: е!ев[з ! ч.=д:) чозе [оЕ1ев(зп[ Ь) ( ч = Ь.) зпз ЕгопЕ1ев(1 ( ге[пгп и; ) ргзча1е: зпг ч; с!ага Е1евд[асьп е1ев ( рнЫ Зс: Е1евлгасх(З ( и ?е-0:) чан! риаще1ев з) ( 51?8 5з?ев!; 5[пгаде[5з?е]=1,) е1ев рпр(1 ( аз?е-ю ?е-1. гегигп гогаде[гн ?е+1]) рычага зп[ аз?е: е1ев Ыогаде[100]: ) ( е1ев х: Е1евд[аск ун 7.2.

Наследование 315 тпт т: геас>т); - Получаеи целочисленное значение ллл т х тоЕ1еж т), - Преобразуен х к типу е1ев у.роль>х), — Поиешаеи х в стек у Этот пример иллюстрирует некоторые важные аспекты использования классов для инкапсуляпии данных: 1. Все открытые (рцЫ>с) имена в классе е1евт наследуются в классе Е1етвЕЕасЕ. Эти имена также являются открытыми в Е1ел>5гасЕ и известны для любого пользователя этого стека. 2. Содержимое объекта типа е)елт является закрытой (рйчате) информацией и не известно за пределами определения класса.

В нашем примере тоЕ1елт и Егов>Е)евт действуют как операции приведения типов, которые преобразуют объекты целочисленного типа к типу е1еп. Такие операции нужны всегда, если внутренняя структура класса закрыта. Ключевые слова ргт уаЕе и рц)>1>с ишюльзуются для определения области видимости наследуемых объектов. В языке ) ауа они являтотся атрибутами обьектов данных, В Сч-ч- н ) ача имеется также ключевое слово ргоЕесЕет), означавшее, что имя с этны модификатором является видимым для любых типов, производных от базового типа, но не известно вне иерархии определения классов. Реализация. Реализация классов не прибавляет слишком много работы транслятору. Для производного класса к пространству локальных переменных добавляются наследуемые имена базового класса, и только открытые имена делаются видимымп для пользователей этого класса.

Истинное распределение памяти для опрсделс>шых объектов может быть осуществлено статически с использованием объявлений данных в определении класса. Если в определении класса присутствует конструктор, то транслятор должен включать в создаваем ый код об рашен не к этой фун к ци и каждый раз, когда он встречает обьявленис объекта этого класса (например, прн входе в блок). Наконец, вызов методов, например х.роз)т(т ), обрабатывается транслятором как вызов функции роз)т(х, т ), где х рассматривается как неявный первый аргумент этой функции. Уттр>тв>тс>т>те памятьк> такое же, как в стандартном С; в Сч-ч- также может быть использована та же самая, что и в С, основанная на стеках организация.

Реализовать управление памятью в языке)ача несколько сложнее, так как массивы в)ача явля>отея динамическими. Объявление массива и его размещение в памяти осуществляются црн помо>ци оператора пеи. Например, тп>О НенАггау = пен ~от[10), создает массив с именем йеи>Аггау, а операция поит динамически выделяет пространство памяти для десяти целых чисел, которые составят элементы этого массива. Таким образом, Не>>Аггау является просто указателем на это лтесто в памяти.

Виртуальная машина) ана для динамического размещения массивов использует спепиальную область памяти, называемую кучей. Для каждого экземпляра класса выделяется собственная область памяти, состоя>цая из объектов данных, формирующих объекты класса, а также указателей на все методы, определенные для объектов этого класса. Если некоторый объект 316 Глава 7. Наследование является производным от некоторого базового класса, то транслятор копирует все детали реализации этого класса в то место памяти, которое отведено для фактического размещения создаваемого Объекта, Этот подход к наследованию называется оснопаннььн нд колировании и является наиболее простой и очевидной моделью его реализации.

Альтернативным вариантом реализации является основинныйпп делегировании подход, В этом варианте любой обьект г>рг>изводноп> класса будет использовать область памяти данных базового класса. Наш>едуемые свойства базового класса нс дублируются в производном объекте. Эта модель подразумевает некую форму совместного использования данных, которая позволяет автоматически изменять производный обьект в соответствии с изменениями базового объекта. В С++ наследование реализовано с использованием основанного па копировании подхода, по надо отметить, что альтернативный способ более эффективно использует ресурсы памяти (благодаря совместному использованию наследуемых свойств объектов разнылш программами) и позволяет автоматически и мгновенно распространять изменения одн<нт> объекта цо всей иерархии Производных классов.

Множественное наследование В этом разделе при обсуждешш классов в языке Се+ предцолагалось, что иерархия классов имеет древовидную структуру со мно>ксством Производных классов, наследующих данные и функции, определенные в родительских классах. Это модель, реализованная В языке ЯщаПга((г, который стал первым объектно-ориентированным языком (см. раздел 7.2.5). Но в языке Съж допускается построение новых классов, производных одповрсмешн> от ~ ~се кол ьких родительских классов. В объявлении с1азз А В.Е (. ) класс А является производным как от класса В, так и от класса Е. До тех пор пока множества обьсктов, определяемых классами В и Е, не церскрыва>отея, никаких проблем с объединением их в одном классе А не возникает.

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

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

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