Программирование >>  Дополнительные возможности наследования 

1 ... 92 93 94 [ 95 ] 96 97 98 ... 265


Как правило, с базовым классом связано несколько производных классов. Поскольку собаки, кошки и лошади являются представителями млекопитаюших, то с точки зрения С++ можно сказать, что все эти классы произведены от класса Mammal.

Царство животных

Чтобы более наглядно раскрыть смысл наследования классов, рассмотрим эту тему на примере отношений между многочисленными представителями животного мира. Представим себе, что программисту, поступил заказ на создание детской игры Ферма .

Когда вы приступите к созданию животных, обитаюших на ферме, включая лошадей, коров, собак, кошек, овец и т.д., вам потребуется снабдить каждый их класс такими методами, благодаря которым они смогут вести себя на экране так, как этого ожидает ребенок. Но на данном этапе каждый метод снабжен только функцией вывода на печать. Это обшая практика программирования, когда сначала вьшолняется только формулировка набора методов, а детальная проработка их откладывается на потом. Вы вправе использовать все примеры программ, приведенные в этой главе, как основу для дальнейшей доработки с тем, чтобы все животные вели себя так, как вам хочется.

Синтаксис наследования классов

Для создания нового производного класса используется ключевое слово class, после которого указывается имя нового класса, двоеточие, тип обьявления класса (public или какой-нибудь другой), а затем имя базового класса, как в следующем примере:

class Dog : public Mammal

Типы наследования классов рассматриваются далее в этой книге. Пока будем использовать только открытое наследование. Класс, из которого производится новый класс, должен быть объявлен раньше, иначе компилятор покажет сообшение об ошибке. Пример наследования класса Dog от класса Mammal показан в листинге 11.1.

Листинг 11.1. Простив иасдвдоеаннв

2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19

Листинг 11.1. Простое наследование Sinclude <iostream.h>

enum BREED { GOLDEN, CAIRN, DANDIE, SHETLAND, DOBERMAN, LAB }

class Mammal {

public: Конструкторы Mammal(); MammalO;

Методы доступа к данным

int GetAgeOconst;

void SetAge(int);

int GetWeightO const;

void SetWeightO;

Другие методы



20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

void SpeakO const; void SleepO const;

protected; int itsAge; int itsWeight;

class Dog : public Mammal {

public;

Конструкторы

DogO;

-DogO;

Методы доступа к данным BREED GetBreedO const; void SetBreed(BREED);

Другие методы WagTailO; BegForFoodO;

protected;

BREED itsBreed;

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

Класс Mammal объявляется в строках 6-27. Обратите внимание, что класс Mammal не производится ни от какого другого класса, хотя в реальной жизни можно сказать, что класс млекопитающих производится от класса животных. Но в С++ всегда отображается не весь окружающий мир, а лищь модель некоторой его части. Действительность слищком сложна и разнообразна, чтобы отобразить ее в одной, даже очень большой профамме. Профессионализм состоит в том, чтобы с помощью относительно простой модели воспроизвести объекты, которые будут максимально соответствовать своим реальным эквивалентам.

Иерархическая сфуктура нашего мира берет свое начало неизвестно откуда, но наша конкретная профамма начинается с класса Mammal. В связи с этим некоторые переменные-члены, которые необходимы для работы базового класса, должны быть представлены в объявлении этого класса. Например, все животные независимо от вида и породы имеют возраст и вес. Если бы класс Mammal производился от класса Animals, то можно было бы ожидать, что он унаследует эти атрибуты. При этом атрибуты базового класса становятся атрибутами произведенного класса.



Чтобы облегчить работу с программой и ограничить ее сложность разумными рамками, в классе Mammal представлены только шесть методов: четыре метода доступа, а также функции Speak() и Sleep().

В строке 29 класс Dog наследуется из класса Mammal. Все объекты класса Dog будут иметь три переменные-члена: itsAge, itsWeight и itsBreed. Обратите внимание, что в объявлении класса Dog не указаны переменные itsAge и itsWeight. Объекты класса Dog унаследовали эти переменные из класса Mammal вместе с методами, объявленными в классе Mammal, за исключением копировшика, конструктора и деструктора.

ЗакрышьШ или защищенньШ

Возможно, вы заметили, что в строках 24 и 45 листинга 11.1 используется новое ключевое слово protected. До сих пор данные класса определялись с ключевым словом private. Но члены класса, объявленные как private, недоступны для наследования. Конечно, можно бьшо в предьщущем листинге определить переменные-члены itsAge и itsWeight как public, но это нежелательно, поскольку прямой доступ к этим переменным получили бы все другие классы профаммы.

Нашу цель можно сформулировать следующим образом: сделать переменную-член видимой для этого класса и для всех классов, произведенных от него. Именно таковыми являются защищенные данные, определяемые ключевым словом protected. Защищенные данные доступны для всех произведенных классов, но недоступны для всех внешних классов.

Обобщим: существует три спецификатора доступа - public, protected и private. Если в функцию передаются объекты класса, то она может использовать данные всех переменных-членов и функций-членов, объявленных со спецификатором public. Функция-член класса, кроме того, может использовать все закрытые данные этого класса (объявленные как private) и защищенные данные любого другого класса, произведенного от этого класса (объявленные как protected).

Так, в нашем примере функция Dog: :WagTail() может использовать значение закрытой переменной itsBreed и все переменные класса Mammal, объявленные как public и protected.

Даже если бы класс Dog бьш произведен не от класса Mammal непосредственно, а от какого-нибудь промежуточного класса (например, DomesticAnimals), все равно из класса Dog сохранился бы доступ к защищенным данным класса Mammal, правда только в том случае, если класс Dog и все промежуточные классы объявлялись как public. Наследование класса с ключевым словом private будет рассматриваться на занятии 15.

В листинге 11.2 показано создание объекта в классе Dog с доступом ко всем данным и функциям этого типа.

Аистинг 11.2. НсноАьзование днас едованных объектов

Листинг 11,2. Использование унаследованных обьектов ftinclude <iostream.h>

enum BREED { GOLDEN, CAIRN, DANDIE, SHETLAND, DOBERMAN, LAB } ;

class Mammal {



1 ... 92 93 94 [ 95 ] 96 97 98 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика