Главная » Просмотр файлов » Г. Шилтд - Самоучитель C++ (PDF)

Г. Шилтд - Самоучитель C++ (PDF) (1114887), страница 33

Файл №1114887 Г. Шилтд - Самоучитель C++ (PDF) (Г. Шилтд - Самоучитель C++ (PDF)) 33 страницаГ. Шилтд - Самоучитель C++ (PDF) (1114887) страница 332019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

В этом примерекласс В1 является косвенным базовым классом для класса D2. Отметьте, чтокласс D2 имеет доступ к открытым членам классов D1 и В1. Как вы ужедолжны знать, при наследовании открытых членов базового класса они становятся открытыми членами производного класса. Поэтому, если класс D1наследует класс В1, то функция geta() становится открытым членом классаD1 и затем открытым членом класса D2.Как показано в программе, каждый класс иерархии классов должен передавать все аргументы, необходимые каждому предшествующему базовому классу.

Невыполнение этого правила приведет к ошибке при компиляциипрограммы.226Самоучитель C++Здесь показана иерархия классов предыдущей программы:В1D1D2Перед тем как двигаться дальше, необходимо небольшое замечание о стилеизображения графов наследования в C++. Обратите внимание на то, что впредыдущем графе стрелки направлены не вниз, а вверх.Традиционно программисты C++ изображают отношения наследования ввиде прямых графов, стрелки которых направлены от производного к базовому классу. Хотя новички могут посчитать такой подход излишне схематичным, именно он обычно практикуется в C++.2. Здесь представлена переработанная версия предыдущей программы, в которой производный класс прямо наследует два базовых класса:^include <iostream>using namespace std;// Создание первого базового классаclass Bl {int a;public:Bl(int x) { a = x; }int geta() { return a; }// Создание второго базового классаclass B2 {int b;public:B2 (int x}fb = x;}int getbO { return b; }// Прямое наследование двух базовых классовclass D: public Bl, public B2 {int c;ГлаваНаследование'Л227_public:// здесь переменные z и у// напрямую передаются классам В1 и В2D{int x, int у/ int z) : Bl(z), B2(y){с = х;/* Поскольку базовые классы наследуются как открытые, класс D имеетдоступ к открытым элементам классов В1 и В2*/intvoid show ( ) {cout « getaO « ' ' « g e t b ( ) « ' ';cout « с « ' \ n ' ;main()D ob(l, 2, 3) ;ob.show() ;return 0;В этой версии программы класс D передает аргументы по отдельности классам В1 и В2.

Теперь иерархия классов выглядит таким образом:BlB2D3. В следующей программе показан порядок, в котором вызываются конструкторы и деструкторы, когда производный класс прямо наследует несколькобазовых классов:#include <iostream>using namespace std;class Bl {public:B l { } { cout « "Работа конструктора класса В1\п";-Bl() { cout « "Работа деструктора класса В1\п";1;}}228___СамоучительC++class B2 {int b;public:B2 ( ) ( cout « "Работа конструктора класса В2\п"; }~В2 ( ) { cout « "Работа деструктора класса В2\п"; )// Наследование двух базовых классовclass D: public Bl, public B2 {public:D() { cout « "Работа конструктора класса D\n"; }~D() { cout « "Работа деструктора класса D\n"; }};int main (){D ob;,return 0;Эта программа выводит на экран следующее:РаботаРаботаРаботаРаботаРаботаРаботаконструктора класса В1конструктора класса В2конструктора класса Dдеструктора класса Dдеструктора класса В2деструктора класса В1Как уже установлено, когда прямо наследуются несколько базовых классов,конструкторы вызываются слева направо в порядке, задаваемом списком.Деструкторы вызываются в обратном порядке.! Упражненияч^1.

Что выводит на экран следующая программа? (Попытайтесь определить это,не запуская программу.)^include <iostream>using namespace std;class A {public:A() { cout « "Работа конструктора класса А\п"; }~-A{) { cout « "Работа деструктора класса А\п"; }Глава7.Наследование_229class В {public:В() { cout « "Работа конструктора класса В\п"; }~В() { cout « "Работа деструктора класса В\п"; }};class С: public A, public В (public:С(} ( cout « "Работа конструктора класса С\п"; }~С() { cout « "Работа деструктора класса С\п"; }};int main ( ){С ob;return 0;2. Используя следующую иерархию классов, создайте конструктор класса С так,чтобы он инициализировал переменную k и передавал аргументы конструкторам А() и В().^include <iostreani>using namespace std;class A {int i;public:A{int a) { i = a; }class В {int j;public:В {int a) { j = a; }class C: public A, public В {int k;public:/* Создайте такой конструктор C(), чтобы он инициализировалпеременную k и передавал аргументы конструкторам А() и ВО */7.5.

Виртуальные базовые классыПри многократном прямом наследовании производным классом одного итого же базового класса может возникнуть проблема. Чтобы понять, что этоза проблема, рассмотрим следующую иерархию классов:Самоучитель C++230БазовыйБазовыйПроизводный!Производный!ПрошводныйЗЗдесь базовый класс Базовый наследуется производными классами Производный! и Производный2. Производный класс ПроизводныйЗ прямо наследуетпроизводные классы Производный! и Производный2. Однако это подразумевает, что класс Базовый фактически наследуется классом ПроизводныйЗ дважды — первый раз через класс Производный!, а второй через классПроизводный2.

Однако, если член класса Базовый будет использоваться вклассе ПроизводныйЗ, это вызовет неоднозначность. Поскольку в классеПроизводныйЗ имеется две копии класса Базовый, то будет ли ссылка наэлемент класса Базовый относиться к классу Базовый, наследуемому черезкласс Производный!, или к классу Базовый, наследуемому через класс Производный2? Для преодоления этой неоднозначности в C++ включен механизм, благодаря которому в классе ПроизводныйЗ будет включена толькоодна копия класса Базовый.

Класс, поддерживающий этот механизм, называется виртуальным базовым классом (virtual base class).В таких ситуациях, когда производный класс более одного раза косвеннонаследует один и тот же базовый класс, появление двух копий базовогокласса в объекте производного класса можно предотвратить, если базовыйкласс наследуется как виртуальный для всех производных классов. Такоенаследование не дает появиться двум (или более) копиям базового класса влюбом следующем производном классе, косвенно наследующем базовыйкласс.

В этом случае перед спецификатором доступа базового класса необходимо поставить ключевое слово virtual.и ' " •: Примеры' $г\, В этом примере для предотвращения появления в классе derived3 двух копийкласса base используется виртуальный базовый класс.// В этой программе используется виртуальный базовый класс^include <iostreara>using namespace std;Глава7.Наследование_231class base (public:int i ;1;// Наследование класса base как виртуальногоclass derivedl: virtual public base {public:int j ;// Здесь класс base тоже наследуется как виртуальныйclass derived2: virtual public base {public:int k;/* Здесь класс derivedS наследует как класс derivedl, так и классderived2.

Однако в классе derived3 создается только одна копиякласса base*/class derived3: public derivedl, public derived2 {public:int product (} { return i * j * k; }int m a i n f ){derivedS ob;// Здесь нет неоднозначности, поскольку// представлена только одна копия класса baseob.i — 10;ob . j = 3 ;ob.k = 5;cout « "Результат равен " « ob.productf) « '\n';return 0;Если бы классы derivedl и derived! наследовали класс base не как виртуальный, тогда инструкцияob.i - 10;вызывала бы неоднозначность и при компиляции возникла бы ошибка.

(См.представленное ниже упражнение 1.)2. Важно понимать, что даже если базовый класс наследуется производным каквиртуальный, то копия этого базового класса все равно существует внутри232Самоучитель C++производного. Например, по отношению к предыдущей программе этотфрагмент совершенно правилен:derivecil ob;ob.i = 100;Отличие между обычным и виртуальным базовыми классами проявляетсятолько тогда, когда объект наследует базовый класс более одного раза. Еслииспользуются виртуальные базовые классы, то в каждом конкретном объектеприсутствует копия только одного из них. В противном случае (при обычномнаследовании) там было бы несколько копий.1. В программе из примера 1 удалите ключевое слово virtual и попытайтесь откомпилировать программу. Обратите внимание на виды ошибок.2.

Объясните, зачем может понадобиться виртуальный базовый класс.Проверка усвоенияматериала главыТеперь вам необходимо выполнить следующие упражнения и ответить навопросы:1. Создайте исходный базовый класс building для хранения числа этажей икомнат в здании, а также общую площадь комнат. Создайте производныйкласс house, который наследует класс building и хранит число ванныхкомнат и число спален. Кроме этого создайте производный класс office,который наследует класс building и хранит число огнетушителей и телефонов.

(Замечание. Ваше решение может отличаться от приведенного вконце книги. Однако, если функционально оно такое же, считайте егоправильным.)2. Когда базовый класс наследуется производным классом как открытый,что происходит с его открытыми членами? Что происходит с его закрытыми членами? Когда базовый класс наследуется производным классомкак закрытый, что происходит с его закрытыми и открытыми членами?3. Объясните, что означает ключевое слово protected.

(Рассмотрите два случая: когда оно используется для задания элементов класса и когда оноиспользуется в качестве спецификатора доступа.)4. При наследовании одного класса другим, когда вызываются конструкторы классов? Когда вызываются их деструкторы?Глава7.Наследование_2335. Дан следующий фрагмент программы, впишите детали, как указано вкомментариях:^include <iostream>using namespace std;class planet {protected:double distance; // расстояние в милях от Солнцаint revolve;// полный оборот Б дняхpublic:planet (double d, int r) { distance = d; revolve = r; }class earth: public planet {double circumference; // окружность орбитыpublic:/* Создайте конструктор earth (double d, int r) .

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

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

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

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