30-03-2020-Gerbert_Shildt_-_Samouchitel_C__3-e_izdanie_2003 (Герберт Шилдт - Самоучитель C++), страница 10
Описание файла
Файл "30-03-2020-Gerbert_Shildt_-_Samouchitel_C__3-e_izdanie_2003" внутри архива находится в папке "язык СИ учебная литература". DJVU-файл из архива "Герберт Шилдт - Самоучитель C++", который расположен в категории "". Всё это находится в предмете "информатика" из 2 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. .
Просмотр DJVU-файла онлайн
Распознанный текст из DJVU-файла, 10 - страница
Само ключевое слово рвЬВс информирует компилятор о том, что, поскольку класс В будет наследоваться, значит, все открытые элементы базового класса будут также открытыми элементами производного класса. Однако все закрытые элементы базового класса останутся закрытыми и к ним не будет прямого доступа из производного класса. Ниже приводится законченная программа, в которой используются классы ВиР: // Простой пример наследования ()1пс1ибе <1овт пеево пятпд патеврасе ввбЗ // Определение базового класса с1аяв В ( 1пс з.з рпЬ11сз чо1б яеС з(1пс п)з 1пс деС з.()З ); // Определение производного класса с1аяв Гм рагс В ( 1пс 3з разо: чо15 яес з (1пс и) з 1пС щп1() з // задание значения 1 в базовом классе чозб Вз:вее 1(1пп и] ( = пз // Возвращение значения з в базовом классе гпе Вззяее з() ( гесптп з.з ! Глава 2.
Введение в классы 59 // Задание значения ! в производном классе чо1б 0:гзее 3 )1пп п) ) = пг ) Возвращение значения 1 базового класса и ! — производного 1пе 0::щц1)) ) // производный класс может О вызывать функции-члены базового класса гегцггг ! * деТ г))г гпе щаьгг) ) ) Р оЬ' оЬ.зес 1)10); // загрузка 1 в базовый класс оЬ.зее 3(4)г // загрузка ! в производный класс соцп « оЬ.щц1[)г // вывод числа 40 геСцгп Ог Обратите внимание на определение функции ща!(). Отметьте, что функция йе! !О, которая является членом базового класса В, а не производного 1), вызывается внутри класса Р без всякой связи с каким бы то ни было объектом.
Это возможно потому, что открытые члены класса В становятся открытыми членами класса Р. В функции ти)0 вместо прямого доступа к 1, необходимо вызывать функцию йе! 10, поскольку закрытые члены базового класса (в данном случае 1) остаются закрытыми для нее и недоступными из любого производного класса. Причина, по которой закрытые члены класса становятся недоступными для производных классов — поддержка инкапсуляции.
Если бы закрытые члены класса становились открытыми просто посредством наследования этого класса, инкапсуляция была бы совершенно несостоятельна. Здесь показана основная форма наследования базового класса: с1азз иия лроиззодиого классаг с д иия базового класса 1 Здесь с д (спецификатор доступа) — это одно из следующих трех ключевых слов: риЫ!с (открытый), рпта1е (закрытый) или рго1ес1ей (защищенный).
Самоучитель С+ч- 60 В данном случае для наследования класса используется именно рвЫ!с, Пол- ное описание этих спецификаторов доступа будет дано позже. 1. Ниже приведена программа, которая определяет общий базовый класс вагш(, описывающий некоторые характеристики фруктов. Этот класс наследуется двумя производными классами Арр]е и Огавяе. Эти классы содержат специальную информацию о конкретном фрукте (яблоке или апельсине).
// Пример наследования классов а з пс 1 псе <1 о я г геат> ()1пс1пс(е <сяг г1пд> пз1пс пазпеярасе ясс(г еппи уп (гго, уея)г еппгп со1от (тес(, уе11он, отееп, отапде]г чоад опп(епнгв уп х) спят *с( ] = ( "тес)", "уе11ои", "свеев", "отапде")г // родовой класс фруктов с1аяя г?н1т ( // В этом базовом классе все элементы открыты рнЬ11с: еппгв уп аппна1г еппдг уп ретеппьа1г еппгп уп Егеег еппгп уп сторьса1з еппгв со1от с1тг сЬат валге(40)з // Производный класс яблок с1аяя Арр1ег рпЬ11с Гспье ( епнвг уп соокфпдг етлп уп стппсЬуг епнвг уп еап1пдг рнЬ11сг чо1б яепа(сЬат *и, еппгв со1от с, ешь уп сх, еппгп уп стопу, епнгв уп е)г чо1с( яион(); ): О Производный класс апельсинов с1азя Отапдег рпЬ11с Ггпье ( епогв угг зпз.сег Глава 2.
Введение в классы чо1б Арр1е::веса(сЬаг *и, епяп со1ог с, ела уп сК, еппт уп сгсЬу, епоп уп е) ( зсгсру(пате, и); апппа1 = по) регеппуа1 = уез; сгее = уез; Сгор1са1 = по; с1г = с; сооКТпд = сК) сгппсЬу = сгсЬу) еагупд = е; чо16 Огапде::зесо(сЬаг *и, епип со1ог с, еп~лп уп 3, еппп уп зг, епшп уп е) зсгсру(паке, и)) аппиа1 = по; регепп1а1 = уез) сгее = уез; Сгоруса1 = уез; с1г = с; двусе = 3; зонг = 5Г) еаг1пд = е; ) чо1б Арр1е:: зЬон() пате « " яблоко — это: " « "1п") "Однолетнее растение".
"; опз(апппа1)) "Многолетнее растение: "; опс(регепп1а1); "Дерево: "; опс(ггее); "Тропическое: "," опс(сгоруса1); "Цвет: " « с[с1г] « "'~п") "Легко приготавливается: "; опт(сооКТпд); "Хрустит на зубах: "; опс(сгппсЬу); "Съедобное: "; опс(еаг1пд)' "'~п"; сопз « сопс « сопс « сонг « сопс « сенс « сопс « сопс « сонг « сопс « епшп уп зонг) етлп уп еасупд) рпЬ11с: чоуб зезо(сЬаг *и, еп1лп со1ог с, епяп уп д', епип уп зг, еплл уп е); чо1б зЬою(); )) Самоучитель С++ чоьб Огапде::я)тои() ( паве « " апельсин — это: " « "1п"1 "Однолетнее растение: "; опт(апппа1) 1 "Многолетнее растение: "; опс(регепп1а1)1 'Дерево: "1 опг(ггее)1 "Тропическое: "; огас(сгорьса1)1 "цвет1 " «с[с1г] « "1п" 1 "годится для приготовления сока: "; опг (]п1се) 1 "кислый: "; оп< (яопг) 1 "Съедобный: "; оп< (еас1пд) 1 "1п" 1 сонг « сонг « сопс « сонг « попс « сонг « сонг « сонг « сонг « сопя « чоЫ опг(еппв уп х) ( 1Г (х==по) сопс « "нетто"1 е1яе попс « "паап"1 ) 1пг ва1п() ( Лрр1е а1, а21 Огапде о1, о21 а1.веса("Красная прелесть", геб, по, уея, уея) а2.веса("Джонатан", ген, уея, по, уея) 1 о1.яего("Пуп", огапде, по, тю, уея) 1 о2.яесо("Валенсия", огапде, уея, уея, по) 1 а1.я)таи()1 а2 .
яЬои () 1 о1. я)тон() 1 о2. яЬои () 1 геспгп 01 Как можно заметить, базовый класс гги[( определяет несколько свойств, характерных для фруктов любого типа. (Конечно, чтобы сократить пример и таким образом приспособить его для книги, класс йтий отчасти упрощен.) Например, все фрукты растут на однолетних или многолетних растениях. Все фрукты растут на деревьях или на растениях другого типа, таких как лоза или куст. Все фрукты имеют цвет и название.
Затем такой базовый класс наследуется классами Арр[е и Огавае. Каждый из этих классов обеспечивает обьект информацией, характерной для фруктов конкретного типа. Этот пример иллюстрирует основной смысл наследования. Создаваемый здесь базовый класс определяет основные черты, связанные со всеми фруктами бЗ Глава 2. Введение в классы Производным классам предоставляется возможность обеспечения тех характеристик, которые являются характерными в каждом конкретном случае. Эта программа раскрывает другой важный аспект наследования: производные классы не "владеют" базовым классом безраздельно. Он может наследоваться любым количеством классов.
1. Дан следующий базовый класс: с1авв агеа с1 рпЬ11с: сопЬ1е Ье1дЬС; оопЬ1е игЖЬ; ); создайте два производных класса гесгавя!е и !вовсе!еа, которые наследуют базовый класс агеа с1. Каждый класс должен включать в себя функцию агеаО, которая возвращает площадь соответственно прямоугольника (тес)апд)е) и равнобедренного треугольника ()вовсе!ез), Для инициализации переменных 1)е)я))1 и «чй)) (высота и длина основания, соответственно) используйте конструктор с параметрами. 2.4. Указатели на объекты До сих пор вы осуществляли доступ к членам объекта с помощью оператора точка (.).
Если вы работаете с объектом, то это правильно. Однако лоступ к члену объекта можно получить также и через указатель на этот объект. В этом случае обычно применяется оператор стрелка (->). (Аналогичным способом оператор стрелка (->) используется при работе с указателем на структуру.) Вы объявляете указатель на объект точно так же, как и указатель на переменную любого другого типа. Задайте имя класса этого объекта, а затем имя переменной со звездочкой перед ним. Для получения адреса объекта перед ним необходим оператор й, точно так же, как это делается для получения адреса переменной другого типа.
Как и для любого другого указателя, если вы инкрементируете указатель на объект, он будет указывать на следующий объект такого же типа. ,ф 1. Простой пример использования указателя на объект: ))1пс1ис)е <1овегеап> пвъпд папеврасе всп; Самоучитель С "+ б4 с1азз пус1азз ( 1пс а; рпЬ11с: пус1азз(ьпс х)> // конструктор ъпе оеп(); пус1азз::пус1азз(1пе х) ( а=х ьпе пус1азз::дев О ( гесптп а; ) 1пс па1п() ( пус1азз оЬ(120); // создание объекта пус1азз *р; // создание указателя на объект р = аоЬ; // передача адреса оЬ в р сопс « "Значение, получаемое через объект:" « оЬ.дев() попс « попс « "Значение, получаемое через указатель:" « р->дев(); геепгп 0; Отметьте, как объявление пус1азз *р; создает указатель на объект класса в)устава. Это важно для понимания следующего положения: создание указателя на объект не создает объекта„оно создает только указатель на него.
Для передачи адреса объекта оЬ в переменную р, использовалась инструкция: р = аоЬ; И последнее, в программе показано, как можно получить доступ к членам объекта с помощью указателя на этот объект. Мы вернемся к обсуждению указателей на объекты в главе 4, когда у вас уже будет более полное представление о С++. бб Глава 2. Введение в классы 2.5. Классы, структуры и объединения Как вы уже заметили, синтаксически класс похож на структуру. Вас, возможно, удивило то, что класс и структура имеют фактически одинаковые свойства.
В С++ определение структуры расширили таким образом, что туда, как и в определение класса, удалось включить функции-члены, в том числе конструкторы и деструкторы. Таким образом, единственным отличием между структурой и классом является то, что члены класса, по умолчанию, являются закрытыми, а члены структуры — открытыми. Здесь показан расширенный синтаксис описания структуры: высыпь иыи типа ( // открытые функции и данные — члены класса ркъчаее: // вакрытые функции и данные — члены класса > список объектов Таким образом, в соответствии с формальным синтаксисом С++ как структура, так и класс создают новые типы данных.