Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Наследование.doc
Скачиваний:
15
Добавлен:
18.04.2015
Размер:
169.47 Кб
Скачать

25

Наследование

Наследование – одна из наиболее фундаментальных концепций ООП.

Суть метода:

Имея разработанные классы, пользователь может создавать производные классы ( порожденные, классы потомки , наследники) , к которым переходят (наследуются) все возможности родительских базовых классов (данные и методы базовых классов) , при этом производные классы могут пополняться собственными компонентами (данными и собственными методами).

Допускается множественное наследование - возможность для некоторого класса наследовать компоненты нескольких базовых классов, несвязанных между собой.

Любой производный класс может в свою очередь быть базовым для других классов и таким образом формируется структура, называемая иерархией классов, определяющая для каждого класса приложения родственные связи (“родитель - потомок”) его с другими классами приложения.

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

Разрабатывая новое приложение Windows, программист может использовать, напр., библиотеку классов OWL, и для решения своей задачи разработать свою иерархию классов, отвечающую конкретной задаче.

В пакет Borland C++ включена большая группа классов самого различного назначения, напр., группа контейнерных классов, реализующих такие структуры данных как списки, деревья, очереди массивы, множества и др. Использование этих классов позволяет сосредоточиться на предметной стороне задачи, не вникая в детали реализации этих классов.

Наследование классов

При наследовании классов важную роль играет статус доступа компонента.

В иерархии классов (при наследовании) относительно доступности компонент принято следующее соглашение:

  1. Собственные (private) методы и данные доступны только внутри класса, где они определены.

  2. Защищенные (protected) компоненты доступны внутри класса, где они определены, и также доступны во все производных классах.

  3. Общедоступные (public) компоненты классаглобальны, т.е. доступны из любой точки программы.

На доступность компонент влияет также выбор ключевого слова (class, struct, union ), с помощью которого объявлен класс.

Следует обратить внимание, что ни базовый, ни производный класс не могут быть объявлены с помощью union.

Классы union не могут использоваться при наследовании! Определение производных классов: сlass t : X, y , z {…} ;

Класс Tпотомок базовых классов X, Y , Z , из которых он наследует компоненты и методы.

Наследуются методы и данные со статусом доступа public и protected!

При этом,

- если производный класс имеет спецификатор class, то компоненты родителя получают по умолчанию в классе потомке статус - private.

- если это structунаследованные компоненты имеют статус public.

class A { protected : int x ;

public : float y ;…} ;

class B : A { . . . } ; // x , y наследуются как private

struct C : A { . . .} ; // x , y наследуются как public

Изменить статус доступа, получаемый по умолчанию можно опять с помощью спецификаторов public, protected и private.

class D: protected A { . . . } ; // x , y наследуются как protected

class E: public A { . . . } ; //x наследуются как protected, а y как public

class M : private A { . . . } ; // x , y наследуются как private

struct N : : protected A { . . .} ; // x , y наследуются как protected

struct P: public A { . . . } ; // x наследуются как protected, а y как public

struct N : : private A { . . .} ; // x , y наследуются как private

Пример:

class A { //базовый класс

int x // закрытое данное класса А

public:

A( int xx =0) { x=xx; cout<< “ A ! ”;} // конструктор класса А

int GetX ( ) {return x;} // функция-член класса А

~A ( ) {cout<<endl<<”DA ”; } // деструктор класса А

} ;

class B : public A { // производный от А класс B

int y; // закрытое данное класса B

public :

B ( int yy=0 ) { y = yy ; cout << “ B ! ” ; } // конструктор класса B

int GetY { return y ;} // функция-член класса B

~B ( ) { cout<< “ DB “ ; } // деструктор класса B

};