Главная » Просмотр файлов » А.В. Столяров - Введение в язык Си++

А.В. Столяров - Введение в язык Си++ (1114949), страница 19

Файл №1114949 А.В. Столяров - Введение в язык Си++ (А.В. Столяров - Введение в язык Си++) 19 страницаА.В. Столяров - Введение в язык Си++ (1114949) страница 192019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Относительно студента нас может ин­тересовать код специальности, номер курса и показатель успеваемости(средний балл). Вместе с тем, несомненно, студент — это тоже человек,так что ему присущи и свойства, общие для всех персон: имя, пол игод рождения. Таким образом, мы можем перейти от общего (персона) кчастному (студент), добавив уточняющие сведения, и сделать это можнос помощью механизма наследования. На С и + + это записывается так:stru c t student : person {in t code;86in t y ea r; / / курсf lo a t average;Если теперь описать переменную типа student, она будет иметь все свой­ства структуры person плюс дополнительные поля:student s 1;strcp y (sl.n am e, "John Doe");s i .

sex = ’ m’ ;si,y e a r_ o f_ b irth = 1989;si.c o d e = 51311;s i.y e a r = 2;si.a v e ra g e = 4 .7 5 ;Структура person в данном случае называется базовой или р о д и т е л ь ­ской, а структура student — унаследованной или порож дённой,иногда дочерней. Также употребляются термины «предок» и «потомок»(в данном случае, соответственно, для person и student).name1sexйотзйyear_of_birth1codeyearaverageРис. 4.1.

Унаследованная структура данныхРасположение полей переменной s i в памяти показано на рис. 4.1.Здесь следует заметить, что поля, относящиеся к части структурыstudent, унаследованной от person, располагаются на тех же местах (потем же смещениям относительно начала), где они располагались бы вструктуре person. Получается, что мы можем при необходимости рабо­тать с переменной s i точно так, как если бы она была переменной типа87person, а не типа student (важно понимать, что обратное неверно: вструктуре person отсутствуют поля, которые ожидались бы от структу­ры student).В связи с этим язык С и + + р азр е ш ае т неявное преобразованиеадресов структур типа student в адреса структур типа person, или, вобщем случае, адресов структур-потом ков к адресам структурпредков.

Соответствующие преобразования разрешены как для указа­телей, так и для ссылок. Таким образом, например, возможны такиефрагменты кода:student s i ;person *р ;р = & sl;person &ref = s i ;Если в программе описана функция, принимающая на вход указательили ссылку на объект типа person, ей без каких-либо сложностей можнопередать, соответственно, указатель или ссылку на объект типа student:void f(p erson &pers) {// ...student s i ;}u ...f ( s i ) ; / / корректно!Это свойство предков, потомков и их адресов называется полимор­ф и зм .Если говорить точнее, полиморфизм не сводится только к преобразованиюуказателей и ссылок. Вообще говоря, полиморфизм в зависимости от контекстапонимается либо как способность некоторых объектов выступать в качестве объ­ектов разных типов (в данном случае si выступает и как student, и как person),либо как способность некоторых функций или других операций работать с объек­тами разных типов (в данном случае f О работает как с person, так и с любымиеё потомками, в том числе student).§4.3.

Н аследован и е и методы ; кон структорыи д естр у к то р ыЧаще всего наследование применяется для структур и классов, имею­щих функции-члены (методы). В дальнейшем изложении мы будем опус­кать слово «структура» и говорить только о классах, хотя всё, что будетсказано, может быть применено также и к структурам.Методы, имеющиеся в базовом классе, доступны и для порождённогокласса. Здесь необходимо отметить, что, если не предпринять специаль­ных мер, то методы базового класса не будут ничего знать о том, что88их вызывают для объекта порождённого класса, то есть будут работатьтак же, как и для объектов базового класса; здесь мы имеем описан­ный в предыдущем параграфе эффект полиморфизма в применении кпараметру th is (см. §2.1.2).

Например, если мы сделаем класс «автомо­биль» и предусмотрим для него операцию «заправка бензином», а потомпородим от него класс «грузовик» с дополнительными свойствами, тооперация «заправка бензином» будет доступна и для грузовика, причёмреализация этой операции не будет ничего знать про особенности грузо­виков и будет работать с объектом типа «грузовик» точно так же, как ис объектом типа «автомобиль».Говорят, что о б ъ е к т порож дённого класса я в л я е т с я в полном смыслеслова т а к ж е и о б ъ е к т о м базового класса, в том числе для него доступныи все операции, которые доступны для базового класса. С другой сторо­ны, как видно из рис.

4.1, объект порождённого класса содерж ит в себеобъект базового класса в качестве своей части. Никакого противоречиятут нет, это просто две разные модели восприятия или, если угодно, точ­ки зрения: одна — точка зрения реализации (реализаторская семантика),вторая — точка зрения логики проектирования (пользовательская семан­тика) .Особого упоминания в связи с введением наследования заслужива­ют конструкторы и деструкторы. С какой бы точки зрения мы ни рас­сматривали порождённый объект, очевидно, что в момент его созданиятакже создаётся и объект базового класса, причём неважно, считаем мыего «частью» порождённого объекта или же его «другой ипостасью».

Та­ким же точно образом при уничтожении порождённого объекта исчезаети базовый объект. Следовательно, при создании объекта порождённогокласса должен отработать и конструктор базового класса, а при уничто­жении такого объекта — деструктор базового класса. При этом, очевид­но, в телах конструктора и деструктора порождённого класса должныбыть доступны все части объекта, для которого они вызываются.

Ба­зовый объект, таким образом, должен быть инициализирован раньше, ауничтожен — позже объекта порождённого. Получается, что время суще­ствования объекта класса-наследника в его «базовой» ипостаси как бычуть-чуть больше, чем время существования его же в качестве объектасвоего собственного типа.С деструктором дела обстоят достаточно просто: компилятор снача­ла вызывает тело деструктора порождённого класса, а затем — тело де­структора базового класса.

С конструктором всё тоже могло бы бытьпросто (сначала вызвать тело конструктора базового класса, потом те­ло конструктора класса порождённого), если бы не то обстоятельство,что конструкторы (в общем случае) могут требовать входных парамет­ров. С похожей проблемой мы уже сталкивались при рассмотрении клас­сов, имеющих поля типа класс (см.

§ 2.16). Решается проблема в данном89случае совершенно аналогично: в описании конструктора порождённогокласса между заголовком и телом вставляется список инициализаторов,начинающийся с инициализатора базового класса (обозначаемого в дан­ном случае именем класса) с указанием всех нужных параметров кон­структора. Так, если А — базовый класс, конструктору которого требу­ются два параметра типа in t, В — класс, унаследованный от А, снабжен­ный конструктором по умолчанию и имеющий поле in t i, то описаниеего конструктора может выглядеть так: .В ::В () : А(2, 3 ), 1(4) { / * . . .

* / }где 2 и З - параметры для конструктора базового класса, 4 — начальноезначение поля i.§4.4. Н аследован и е и защ и таВзаимодействие механизма наследования с механизмом защиты дета­лей реализации заслуживает отдельного разговора. Прежде всего отме­тим, что сам факт наследования одного класса от другого может в неко­торых случаях рассматриваться как деталь реализации этого класса и,соответствено, нуждаться в сокрытии от остального кода программы.В связи с этим в С и + + различают наследование открытое (public)и закрытое (private).

Тип наследования указывается в заголовке классанепосредственно перед названием порождаемого класса, например:c la s s В : pu blic А { / * . . . * / } ;илиc la s s С : p riv a te А { / * . . . * / } ;Если в первом случае все свойства класса А (его открытые методы иполя, если такие в нём есть) будут доступны для объектов класса В ото­всюду, то во втором случае — только из методов класса С, а вся остальнаяпрограмма вообще не будет знать, что класс С унаследован от А.Тип наследования можно не указывать, как мы это делали в примерена стр. 86. В этом случае будут действовать умолчания: для структурынаследование по умолчанию открытое (public), для класса — закрытое(private). В реальной жизни потребность в закрытом наследовании воз­никает редко, поэтому при описании наследуемых классов обычно указы­вают слово pu blic, а при описании наследуемых структур не указываютничего, полагаясь на умолчания.Заметим теперь, что для базового класса порождённый класс ничутьне «лучше» всей остальной программы и, как и любой недружественныйфрагмент кода, не должен иметь доступа к деталям реализации класса.90Поэтому, очевидно, закрытые поля и методы базового класса не будутдоступны порождённым классам.

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

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

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

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