Главная » Просмотр файлов » Р.У. Себеста - Основные копцепции языков программирования (2001)

Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 125

Файл №1160794 Р.У. Себеста - Основные копцепции языков программирования (2001) (Р.У. Себеста - Основные копцепции языков программирования (2001)) 125 страницаР.У. Себеста - Основные копцепции языков программирования (2001) (1160794) страница 1252019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Напомним, как было указано в главе 10, что члены класса могут быть закрытыми. защищенными или открытыми. Закрытые члены доступны только функциям-членам и друзьям класса. И функции, и классы могут быть объявлены друзьями класса и в качестве таковых получить доступ к его закрытым членам. Открытые члены доступны всем функциям. Защищенные члены похожи на закрытые, за исключением их использования производными классами, правила доступа которых описаны ниже. Производные классы могут модифицировать доступ к своим наследуемым членам. Синтаксическая форма для производного класса описана ниже: 11.9. Поддержка объектно-ориентированного программирования...

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

Рассмотрим следующий пример: с1аез Ьазе с1азз ряд чапе: дпк а; к1оак хг ркосессей: дпк Ь; к1оае уг риЬ1з.с: дпе с> к1оас зг с1авв зцЬс1азз 1 : рцЪ11с Ьазе с1азз с1авв зцЬс1азз 2 : рк1тасе Ьазе с1азз ( ... ); В классе зцЬс1азз 1 переменные Ь и у являются защищенными, а переменные с и з — открытыми.

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

Любой член, который должен быть сделан видимым, реэкспортируется в производный класс. Этот реэкспорт в действительности делает член класса видимым, даже если производный класс является закрытым. Рассмотрим следующее определение класса: с1азв зцЬс1азз 3: ркдчаке Ьазе с1азз ) Ьазе с1азз :: с; Теперь экземпляр класса зцЬс1азз 3 имеет доступ к переменной с. Пока речь идет о переменной с, дело обстоит так, как если бы производный класс был открытым.

Двойное двоеточие (:: ) в определении этого класса является оператором разрешения видимости. Он уточняет класс, в котором определена данная сущность. 462 Гдово 11. Поддержка объектно-ориентировонного прогроммировония Рассмотрим следующий пример наследования в языке С++, в котором определен класс для связного списка общего вида, используемый для определения двух полезных подклассов: с1авз запд1е 11пкеб 11зт ( с1азв побе ( ггавпб с1авв запд1е 11пхеб 11зс; ргдчасв: побе *11пК дпс сопгепгз) рвача се: побе *пеаб> риЫл.с: запд1е 11пКес) 11зс() ()зеаб = 0); чодб 1пзегс ас )зеаб(апк)) чоЫ 1пзегс ат Га11(апв); апс геаоче аг )зеаб()) апс еарсу[7: ): сложенный класс побе определяет ячейку связного списка, которая содержит целую переменную и указатель на ячейку.

Он указывает класс здпд1е 11пКеб 11зг в качестве своего друга (ггавпб), предоставляя таким образом объектам класса здпа1е 11пКеб 11зг доступ к своим ланным-членам 11пК и сопсепсз. Это необходимо, поскольку содержащие их классы не имеют специальных прав доступа к членам своих вложенных классов. Содержащий класс з1пд1е 11пКеб 11зг имеет только одно данное-член, действующее в качестве указателя на голову списка. Он содержит конструктор, который просто инициализирует переменную Ьеаб нулевым указателем. Четыре функции-члена позволяют вставлять узлы в один из двух концов списка, удалять узлы из одного конца списка и проверять, не пуст ли список. Следующие определения описывают классы для стека и очереди на основе класса запд1е 11пКеб 11зг; с1авв зсасК: риЫас зап91е 11пКеб 11зс ( р Ыхс: згасК() () чоаб риз)т(апс ча1ое) ( здпд1е 11пКеб 11зс :: 1пзегт аГ )зеаб(йпв ча1ое); ) зпс рор() ( гвсигп здпд1е 11пКеб 11зг:: геточе ас )зеаб() ) ) с1авз Чоеое : риЬ11с запд1е 11пКеб 11зс ( ри)з1л.с: Чоеое() () чойб епЧоеое(апс ча1ие) ( запд1е 11пКеб 11зг:: 1пзегг аг га11(хпв ча1ое); 11.9.

Поддержка объектно-ориентированного программирования... дпе бес(цеце () ( я1пс1е 11п)себ 11яс :: гежоче ас йеаб() )' Заметим, что объекты обоих подклассов агаси и с(цеце имеют доступ к функции емргу, определенной в базовом классе язпй1е 11п)себ 11яг (поскольку при выводе этих подклассов их базовый класс определен как открытый). Оба подкласса определяют конструктор, который не выполняет никаких действий. Когда создается объект подкласса, соответствующий конструктор вызывается неявно. Затем вызывается любой подходящий конструктор из базового класса. Таким образом, в нашем примере, когда создается объект типа агасси, вызывается конструктор ягас)с, не выполняющий никаких действий. Затем вызывается конструктор язпц1е 11п)себ 11яс, выполняющий необходимую инициализацию.

И класс ягас)с, и класс с(цеце страдают одним и тем же недостатком — объекты обоих классов имеют доступ ко всем открытым членам родительского класса я1па1е 11пйеб 11яг. Следовательно, объект агаси может вызвать метод 1пяегг аг га1)., разрушив таким образом целостность стека. Аналогично, объект г)цеце может вызвать метод 1пяегс ас )зеаб. Подобные нежелательные вызовы возможны, поскольку и класс ягвс~.

и класс с)цеце являются полтинами типа я1щ1е 11п)себ 11я г. Эти два класса можно написать так, чтобы они не были подтипами своего родительского класса, используя при их определении специфнкатор доступа ркдчаке вместо рч)з1дс. В этом случае им потребуется скопировать метод ежргу, поскольку он будет скрыт от их экземпляров. Новые определения типов для стека и очереди под названием ясасй 2 и с(цеце 2, соответственно, показаны ниже: с1авя ясасй 2: ргдчаке я1пс1е 11пхеб 11яс ( риЫдо: ягас)с 2 () () чозб рцяП(дпе ча1ое) ( я1пс1е 11пйеб 11яг:: 1пяегг аг )зеаб(дпс ча1ие); хпк рор() ( геепгп я1пц1е 1гпйеб 11яс :: гемоче ас )теаб()г ) я1пц1е 11пйеб 11яг:: етргуг с1аяя г(цеце 2: ргхчасе я1пд1е 11пйеб 11яс ( рип1ха: с)цеце 2() чойб епс(цеце(йпс ча1ие) ( язпд1е 11пйеб 11яг:: зпяегг аг га11(зпс ча1ие); дпк бес(иеие () ( кесикп я1пд1е 11пйеб 11яг:: геаоче аг )зеаб() ) я1пд1е 11пйеб 11яс :: еарсу; Эти два варианта классов для стека и очереди иллюстрируют различие между подтипами и пронзводнымн типами, не являющимися подтипами.

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

—.-'пример, с1аее А ( с1еев В ( с1еее С: риЬ1' с А, риЬ11с В ( .. ) з .:ласс С наследует все члены и от класса, и от класса В. Если окажется, что классы А н ):одержат члены с одинаковыми именами, то на них можно однозначно ссылаться в ..ьектах класса С с помощью оператора разрешения области видимости. Замешаюший и замещаемый методы в языке С++ должны иметь одинаковые прото*.

лы. Если в протоколах есть какое-либо различие, метод в подклассе рассматривается зк новый метод, не имеющий никакого отношения к методу с таким же именем в роди-ельском классе. 11.9.3. Динамическое связывание Все функции-члены, которые мы определяли до сих пор, являются статически свягзниыми, т.е. вызов каждой из них статически связан с определением функции. В языке : — указатель или ссылку, имеющую тип базового класса, можно использовать для ука:зния на объект любого класса, производного от этого родительского класса.

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

Если нужно изобразить эти фигуры на экране дисплея, то функция-член 6ган, зредназначенная для изображения фигуры на экране, должна быть уникальной для каж=ого подкласса, или вида фигуры. Эти версии функции с(гам должны быть определены как виртуальные функции.

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

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

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

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