Г. Шилтд - Самоучитель C++ (DJVU) (1114955), страница 33
Текст из файла (страница 33)
Конструктору производного класса совершенно нет необходимости как-то обрабатывать аргумент, предназначенный для передачи в базовый класс. Если производному классу этот аргумент не нужен, он его просто игнорирует и передает в базовый класс. Например, в этом фрагменте параметр п конструктором Йептей() не используется.
Вместо этого он просто передается конструктору ЬаяеО: с1аяв Ьаяе ( 1пг 1; рпЬ11с: Ьаве (1пв и) ( оопп « "Работа конструктора базового классаМ" -Ьаве () ( сонг « "Работа деструктора базового классМп"; ) чо1й вЬои1() ( сопя « 1 « 'М'г ) с1аяя йег1чей: риЬ11с Ьаве ( рпЬ11с: йсПчей((пг и) ", Ьаяе(п) ( // передача аргумента в базовый класс Глава 7.
Наследование сонь « "Работа конструктора производного класса1п"г — О; !1 аргумент п здесь не используется ) -аег1гес)() ( соп « "Работа деструктора производного классаМ"' гоЫ япоиЗ () ( сопл « З « '1п' ' 1. В приведенном ниже фрагменте добавьте конструктор для класса пгуйег1чеа.
Он должен передать указатель на инициализируемую строку конструктору класса пгуЬаяе. Кроме того, конструктор тудепге(1() должен инициализировать переменную 1еп длиной строки. 111пс)иг)с <1оя1геат> ()1пс1и<(е <сявг1пд> ия1пя пагпеярасе я1б; с1ая я туЬа яе СЬаГ япг[80) 1 рпЬ11с: ьтуЬаяе(спаг вя) ( я1гсру(я1г, я) г ) сйаг *деГ () ( ге1игп яраг; с1аяя тубеггуес(: 1п1 1еп; рпЬ11с: добавьте 1пб деб1епй) гоЫ япои() рпЬ11с пуЬаяе здесь конструктор гау<(ег1чег(() гебпгп 1еп; ) сонь « деС() « '~п"Г ) 1пп паьп () ( туйег1гес) оЬ ("привет"); оЬ,яЬои() 1 сонг « оь.дег1еп() « 'М'; гегигп ()г 2. Используя следующий фрагмент„создайте соответствующие конструкторы саго и 1гпей().
Они должны передавать необходимые аргументы объектам класса теЫс)е. Кроме этого конструктор саго должен при создании объекта Самоучитель С++ ()апс1ис)е <1оз~театп> ивтпс патеврасе вгс); Базовый класс автомобилей для разных типов с1авв чеЛ1с1е ( тпг поп~ нЛее1з; 1пь хапде; риЛ11с: чеЛ1с1е(апь и, 1пь г) пил~ иЛее1з = х; тапсе = г; чей зЛонч () ! соис « "число колес" « пшп нЛее1в « соив « "Грузоподъемность " « тапсе « '~п'1 '1п'у с1авв саг: риЬ11с чем(с1е ( 1пг раваепдетв) риЬ11с: вставьте здесь конструктор сад() чотс( зЛон() вЛонч (); соиг « *'Пассавироемкость" « раввепсегв « '1п'; с1авв сгиск: ри)о11с чеЛ1с1е тпс 1оаа1.ли'с; риЬ11с: /! вставьте здесь конструктор скис)<() ъотй зЛоы() 1 вЛоич () а соиь « "Пробег" « 1оаб11пи'~ « ' ~п ' р 1пс татп () саг с (5~ 4 500) р 'ьгисК Ь (30000, 12, 1200); инждлализировать переменную раввепдегв, а конструктор ЙысйΠ— переменвуд 1оа()1да11, Глава 7, Наследование сош « "легковая машина: 'Ю" 1 с.
аЬои(); СОПС « "~ПГРУВОВИК:~П"1 Ь. яйон (); тешт, О; Для конструкторов сат() и 1гцсКО объекты должны объявляться следующим образом: саг оЬ(раазепсегв, лпее1а, гапде); ггпс)~ оЬ (1оаб1тшт~, нЛее1в, тапсе) 1 7.4. Множественное наследование Имеются два способа, посредством которых производный класс может наследовать более одного базового класса. Во-первых, производный класс может использоваться в качестве базового для другого производного класса, создавая многоуровневую иерархию классов. В этом случае говорят, что исходный базовый класс является косвенным (тйгес() базовым классом для второго производного класса.
(Отметьте, что любой класс — независимо от того, как он создан — может использоваться в качестве базового класса.) Во-вторых, производный класс может прямо наследовать более одного базового класса. В такой ситуации созданию производного класса помогает комбинация двух или более базовых классов. Ниже исследуются результаты, к которым приводит наследование нескольких базовых классов.
Когда класс используется как базовый для производного, который, в свою очередь, является базовым для другого производного класса, конструкторы всех трех классов вызываются в порядке наследования. (Это положение является обоб)цением ранее исследованного принципа.) Деструкторы вызываются в обратном порядке. Таким образом, если класс В1 наследуется классом Ш, а В1 — классом В2, то конструктор класса В1 вызывается первым, за ним конструктор класса Ш, за которым, в свою очередь, конструктор класса Р2.
Деструкторы вызываются в обратном порядке. Если производный класс напрямую наследует несколько базовых классов, используется такое расширенное объявление: с1ааа лмя провзводвого класса; сп доступа вмк базового класса1, сс доступа лмв базового класса<„ сп доступа вмя базового-классаМ // ... тело класса Самоучитель Сч-ь Здесь имя базового «ласса1 ... ами базового классаХ вЂ” имена базовых классов, сл доступа — спецификатор доступа, который может быть разным у разных базовых классов.
Когда наследуется несколько базовых классов, конструкторы выполняются слева направо в том порядке, который задан в объявлении производного класса. Деструкторы выполняются в обратном порядке. Когда класс наследует несколько базовых классов, конструкторам которых необходимы аргументы, производный класс передает эти аргументы, используя расширенную форму объявления конструктора производного класса: яонотр лромаа класса Гс пиоох арг): имя базового ялаоса1 (сллсояарг), имя оааового хлаооа2 Гопжооя арг), , имябааоаого ялаооаЗтГ список арг) О ... тало холотруятора проияводттопо ялаооа Здесь им« базового класса1...
им« базового классаХ вЂ” имена базовых классов. Если производный класс наследует иерархию классов, каждый производный класс должен передавать предшествующему в цепочке базовому классу все необходимые аргументы. 1. В этом примере производный класс наследует класс, производный от другого класса. Обратите внимание, как аргументы передаются по цепочке от класса Р2 к классу В1. // Множественное наследование ()тпсгос)е <1оаллеал> ия(па патпеярасе яМ; с1ааа В1 (пг а; риЬ11с; В" [тп~ х) ( а = х; (п1 оееа() ( тстшп а; ) Прямое наследование базового класса с1аяя Р1: рпЬ11с В1 ( тпЬ Ь; риЬ1(с: Рт(тпс х» тп у): 31(у) т/ передача переменной у классу В1 Глава 7, Наследование Ь=к) 1 (пГ деГЬ() С геГпгп Ьу Прямое наследование производного класса // и косвенное наследование базового класса с1авв Р2: рцЬ) 1с Р1 ( 1пс сг рцЬ11с: Ья (1пс х, 1пп у, 1пб к): П1(у, з) // передача аргументов // классу И с=х; /* Поскольку базовые классы наследуются как открытые, класс П2 имеет доступ к открытым элементам классов В1 и П1 */ чсфср зисы ( ) ( соус « деба () « ™ « десЬ О « ' " р сорб«с« ' Хп' 1пб Па1П ( ) П2 оЬ(1, 2, 3); оЬ.знои О; функции овса() л цеГЬ ( ) здесь тоже открыты соцб « оЬ.деба() « ' ' « оЬ.дегЬ О « '~п'; гесцгп Ор Вызов функции оЬ.яЫои() выводит на экран значения 3 2 1.
В этом примере класс В1 является косвенным базовым классом для класса Р2. Отметьте, что класс 02 имеет доступ к открытым членам классов Р1 и В1. Как вы уже должны знать, при наследовании открытых членов базового класса они становятся открытыми членами производного класса. Поэтому, если класс Ш наследует класс В1, то функция яе(аЦ становится открытым членом класса Ш и затем открытым членом класса Р2.
Как показано в программе, каждый класс иерархии классов должен передавать все аргументы, необходимые каждому предшествуюшему базовому классу. Невыполнение этого правила приведет к ошибке при компиляции программы. 22б СаМаучитель С++ Здесь показана иерархия классов предыдущей программы: 02 Перед тем как двигаться дальше, необходимо небольшое замечание о стиле изображения графов наследования в С++. Обратите внимание на то, что в предыдущем графе стрелки направлены не вниз, а вверх. Традиционно программисты С++ изображают отношения наследования в виде прямых графов, стрелки которых направлены от производного к базовому классу.
Хотя новички могут посчитать такой подход излишне схематичным, именно он обычно практикуется в С++. 2. Здесь представлена переработанная версия предыдущей программы, в которой производный класс прямо наследует два базовых класса: Фьпс1и~(е «ьояегеадт> пятнам патеярасе ясс(р Создание первого базового класса с1аяя В1 ( гпс а; риЬ11с: В1(гпс х) ( а = х; ) (пс дега() ( гевигп а; Создание второго базового класса с1аяя В2 ( гпс Ь; риЬ11с: В2 ((пг х) Ь=х," гпт. де1ЬО ( ге" пгп Ь; ) прямое наследование двух базовых классов с1аяя Э: рпЬ11с В1, рпЬ11с В2 ( 1пб с; Глава 227 Наследование рпЬ11с: здесь переменные з и у напрямую передаются классам В1 и Ь2 О(1пК х, зпе ут 1пе а) : В1(а), В2(у) ( с =х; /* Поскольку базовые классы наследуются как открытые, класс Р имеет доступ к открытым элементам классов В( и В2 Э/ чо!д аЬон() сонт « тте1а() « ' ' «ИстЬО « сон( « с « ' ~п' т )пт дта1п () ( Р оЬ(1, 2, 3) оЬ.