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

Void main ( )

{ B b (5) ;

cout<<endl<< “ b =” << b.GetY ( );

cout<<endl<< “ a =” << b.GetX ( );

}

В производный класс B включаются все данные и функции родителя А, при этом данное x - недоступно для прямого обращения из объектов класса B, но к нему можно обращаться из доступных компонентных функций класса А, которые стали полноправными членами класса B : b.GetX ( );

Таким образом, через открытую функцию класса A GetX( ) мы получаем доступ к закрытому данному этого класса (x) , а функция GetY ( ) класса B предоставила доступ к закрытому данному (y) производного класса.

В main создается объект производного класса B, компонентному данному которого передается значение 5.

Данное класса А инициируется значением 0.

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

В нашем случае сначала вызывается конструктор A () , который по умолчанию инициирует x значением 0, а затем вызывается B(5) , инициирующий y значением 5.

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

Результат программы:

A ! B !

b= 5

a= 0

DB DA

Наличие производного класса не запрещает создавать отдельно объекты базового класса, например:

A a ( 7);

Передача параметров в базовый класс

Обычно при создании объекта производного класса требуется инициализировать данные не только производного, но и базового класса.

Для этого в конструкторе производного класса надо явно вызвать конструктор базового класса.

Рассмотрим этот вопрос на примере:

class A { int x1 , x2 ;

public :

A ( int ax1 , int ax2 ) { x1 = ax1 ; x2 = ax2; }

};

class B : public A {

int y ;

public :

B ( int _x1, int _x2 , int _ y) : A ( _x1 , _x2) { y = _ y ; }

} ;

  • В конструкторе производного класса перечисляются в качестве параметров все переменные как производного, так и базового класса, которые надо инициализировать (с написанием их типов).

  • После “ : ” производится вызов конструктора базового класса с перечисленными выше параметрами для базового класса ( естественно, вызов – без указания типов)

  • При вызове конструктора производного класса B ( ) , ему необходимо передать три параметра, два из которых будут переданы конструктору базового класса A ( ).

  • Необходимо учитывать позиционность параметров в описании конструктора базового класса. При этом не важно, какие параметры располагать сначала – базового или производного класса.

B b ( 2 , 3 , 4 ); значения 2 и 3 будут переданы в переменные x1 и x2

а значение 4 – в переменную y.

Для правильного построения конструктора производного класса необходимо иметь описание конструктора базового класса!