Главная » Просмотр файлов » Г. Шилдт - Полный справочник по C++

Г. Шилдт - Полный справочник по C++ (1109478), страница 69

Файл №1109478 Г. Шилдт - Полный справочник по C++ (Г. Шилдт - Полный справочник по C++) 69 страницаГ. Шилдт - Полный справочник по C++ (1109478) страница 692019-04-28СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

с1авв йегъчей1 : риЬ11с Ьаве ( риЬ11сз 1пс ЗЗ )г // Класс йегзчей2 является наследником класса Ьаве. с1авв йег1чей2: рнЬ11с Ьаве ( риЬ11сз зне )гз /* Класс йегъчейЗ является наследником классов йегзчей1 и йегхчей2 одновременно. блегователызо, в каждом его объекте солержатся две копии объекта класса Ьаве) */ с1авв йегтчейЗ з риЬ11с йегъчей1, риЬ11с йегзчей2 ( риЬ11сз 1пс вип; )з 1пе зааъп() ( йегзчейЗ оЬ; оЬ.йег1чей1::1 = 10/ // Неоднозначность устранена, // исгользуется переменная з из класса йег1чей1. оЬ.З = 20; оЬ.)г = Зог // Неоднозначность устранена Глава 16. Наследование оЬ.зищ = оЬ.йег1чей1ззь + оЬ.З + оЬ.Кз // Неоднозначность уатранена аоззг « оЬ.йет(чей1з:1 « саит « оЬ.З « " " « оЬ.к « соие « оЬ.вищз тегитп Оз ) Как видим, оператор разрешения области видимости "з ь" позволяет явно выбрать вариант производна~о класса.

Однако это решение порождает новые проблемы. Что если на самом деле нужна лишь одна копия объекта класса Ьаае! Можно ли предотвратить дублирование объектов класса )заве в обьекте класса ает).чейз? На оба вопроса можно ответить положительно. Решение этих проблем основано на применении вортуольямт бозовмл классов (ч(пиа( Ьазе с)а<вез).

Если базовый класс имеет несколько наследников, его дублирование можно предотвратить. Для этого в объявлении производного класса перед именем базового класса следует поставить ключевое слово ч1геиа1. Например, предыаушузо программу можно исправить слсдуюшим образом. // Программа, использующая виртуальньй базовьвз клаас. $1па1ийе <1оветеат> ив(пц пащезрасе зай; с1азз Ьазе ( риЫз.с: згзг з.з )з // Клааа йетьчей1 является наследникам виртуальногс класаа Ьаве. с1азз йегсчей1 : ч1тсиа1 риЫтс Ьазе ( риЬ1з.а з 1пе )з // Класс йег1чей1 является наследникам виртуального клаааа Ьаве.

с1ааз йетьчей2 : ч1ттиа1 риЫ1а Ьаве ( риЫ1с: 1пе ки ); /* Класа йет1чейЗ является наследником клаасов йет1чей1 и йег1чей2. На этот раз его осъект содержит лищь одну копию объекта базового класса. */ с1авз йег1чейЗ : риЫгс йет1чей1, риЫ1с йегачей2 ( риЬ1хсз зпе вшь; ); 1пе таз.п() ( йет1чейЗ оЬ; оЬ.з = 10з // Неоднозначность устранена оЬ.з = 20з Часть ((, Язык С+(. оЬ.К = ЗО; // Неоднозначность устранена оЬ.вин = оЬ.1 ъ оЬ.З + оЬ.'к; // Неоднозначность устранена соис е< оЬ.1 « соие « оь.б « " ' « оь.к « соие « оЬ.виве гесихт. О; ) Как видим, перел именем базового класса в спепификаиии производного класса стоит ключсвос слово е1геиа1.

Теперь оба класса еег1те61 и аег1теаа являются наследниками аиртуального базового класса Ьаве, и любые их наследники будут содержать лишь одну копию класса ьаае. Следовательно, объект класса аегдтеаз содержит копию объекта класса ьаае, и выражение оЬ.1=1О становится совершенно правильным и однозначным. Следует иметь в виду, что, хотя классы дег1тед1 и аег1тепа объявили класс ьаее виртуальным, его объекты будут по-прежнему частью объектов любого из этих типов. Например, следующий фрагмент является совершенно правильным.

| // Определяем объект класса бег1чеб1 бег1ие61 еус1аав; еус1авв.1 = 86; Различие между обычным базовым классом и виртуальным проявляется, только когда объект наследует несколько объектов одного и того же базового класса. Если используется виртуальный базовый класс, то его объект только один раз копируется в каждый объект производного класса. В противном случае возникает неоднозначность. Глава 1б. Наследование Я зык С++ обеспечивает как статический, так и динамический полиморфизм. Как указывалось а предыдуших главах, статический полиморфизм достигается с помощью перегрузки функций и операторов.

Динамический полиморфизм реализуется на основе наследования и виртуальных Функций. Именно эта тема находится в центре внимания данной главы. ~:3 Виртуальные функции Виртуальна» функция (гйг(ца! )цпсбоп) — это функция-член, объявленная в базовом классе и переопределенная в производном. Чтобы создать виртуальную функцию, следует указать ключевое слово чвхсца1 перед се объявлением в базовом классе. Производный класс переопределяст эту функцию, приспосабливая ее лля своих нужд. По существу, виртуальная Функция реализует принцип "один интерФейс, несколько методов", лежащий в основе полиморфизма.

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

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

Это относится и к ссылкам на обьекты базового класса. Рассмотрим для начала следующий пример. В1пс1цг]е <1овссеав> цвъпд паиеврасе вес]г с1авв Ьаве рцЫ1с: чъхгца1 чо1с] чйцпс(] ( соцс « "Функция чыцпс() из класса Ьаве.1п"; ) ); с1авв сех(чес]1: риЫвс Ьаве ( рцЫзс чо1г] чйцпс(] ( соце « "Функция чыцпс() из класса г]ет1чес]1.1п"; ) ); с1авв г]етъчег]2: рцЫ1с Ьаве ( рцЫъс: чо1е] чбцпс(] ( соцс « " Функция чйцпс() из класса г]ех1чег]2.1п"; ) Часть 1!. Йвык С++ 1пс иа1тс() ( Ьаве *р, Ь; йег1чей1 с)1; йегйчес)2 й2т // Указатель на объект базового класса. р = аЬ; р->чтцпс(); // Вызов функции чбцпс() из класса Ьаве.

// Указатель на объект класса йег1чей1. р = айг; р-ьчбцпс()т // Вызов Функции чбцпс() из класса йегт.чей1. // Указатель на объект класса йег1чей2. р = ай2т р->чбцпсО с // Вызов функции чбцпс() из класса йег1чей2. тегцтп От ) Эта программа выводит на экран следующие строки. Функция чгцпс() из класса Ьаве. Функция чбцпс() иэ класса йегъчей1. Функция чбцпс() иэ класса йетъчей2. Как показывает эта программа, внутри класса Ьаве объявлена виртуальная функция чвцпе(). Обратите внимание на ключевое слово ч1кеиаг в объявлении функции.

прн переопределении функции чвцпеО в классах йек1чейг и йек1чейг ключевое слово ч1теца1 не требуется, (Однако его использование не является ошибкой, просто оно не обязательно.) В данной программе классы йет1чейг н йек1чейг являются производными от класса Ьаве. Внутри каждого из этих классов функция чйшс() переопределяется заново в соответствии с новым предназначением. В программе ма1п[) объявлены четыре переменные. Указатель на базовый класс Объект базового класса Объект класса йекгчейз Объект кпвссв йекх еаг Р Ь йз аг Глава (7.

Виртуальные функции и полиморфизм кроме того, указа(в/но р присваивается адрес объекта ь, а функция чвцпс О вызывается с помощью указателя р. Поскольку указатель р ссылается на объект класса Ьаве, выполняется вариант функции чвппо < ) из базового класса. Затем указателю р присваивается адрес объекта йг, и функция чвцпе О снова вызываешься с его помощью. На этот раз указатель р ссылается на объект класса йет)чей ц Следовательно, вызывается функция йек)лтей1т тчяцпеО. В результате указателю Р пРисваиваетсл адРес объекта йг, поэтому выражение р->чвцпеО приводит к вызову функции чвцпеО из класса йек1чейг. Принципиально важно, что вариант вызываемой функции определяется типом обьекта, на который ссылается указатель р. Кроме того, выбор происходит в ходе выполнения программы, что обеспечивает основу динамического полиморфизма.

Виртуальную функцию можно вызывать обычным способом, используя имя объекта и оператор ".", однако полиморфизм достигается только при обращении к ней через указатель. Например, следующий фрагмент программы является совершенно правильным. В й2.чгцпс О; // Вызывается функция чбцпс() из класса йег1чей2. Несмотря на то что такой вызов виртуальной функции ошибкой нс является, никаких прсимущсств он нс прсдоставляст. На первый взгляд, переопределение виртуатьной функции в производном классе мало отличается от обычнои перегрузки функций.

Однако это нс так, и термин перегрузка неприменим к переопределению виртуальных функций по нсскольким причинам, Наиболее важное отличие заюпочастся в том, что прототип псрсопрсдслясмои виртуальной функции должен точно совпалать с прототипом, определенным в базовом классе. Этим виртуальные функции отличаются от перегруженных, которые отличаются типами и количеством параметров. (Фактичсски при псрсгрузкс функций типы и количество их парамстров доллгиы отличаться! Именно эти отличия позволяют компилятору выбирать правильный вариант перегруженной функции.) при псрсопрслслснии виртуальной функции все аспекты их прототипов должны быль одинаковыми. Если нс соблюдать это правило, компилятор будет считать эти функции просто перегруженными, а их виртуальная природа будет потеряна.

Второе важное ограничение заключается в гом, что виртуальныс функции нс могут быть статическими членами классов. Кромс того, они нс могут быть дружественными функциями. И, наконец, конструкторы нс могут быть виртуальными, хотя на деструкторы зто ограничснис нс распространяется. Из-за перечисленных ограничений' для переопределения виртуальной функции в производном классе используется термин замел(ение (очегпд)пя). Вызов виртуальной функции с помощью ссылки на объект базового класса В предыдущем примере виртуальная функция вызывалась с помощью указателя на объект базового класса, однако полиморфная природа виртуальных функций сохраняется и при их вызове с помощью ссылки на объект базового класса. Как говорилось в главе ) 3, ссылка является неявным указателем.

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

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

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

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

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