- •Наследование
- •Наследование классов
- •Классы union не могут использоваться при наследовании! Определение производных классов: сlass t : X, y , z {…} ;
- •Void main ( )
- •Передача параметров в базовый класс
- •Конструкторы с инициализацией по умолчанию в иерархии классов
- •Класс “точка на графическом экране”. Производный класс –“пятно”
- •Void point :: show (void)
- •Void point ::move ( int xn, int yn )
- •Int&point::GetX (){return X;}
- •Int& point:: GetY(void) {return y;}
- •Initgraph( тип графического драйвера, режим адаптера , путь к драйверу)
- •Void far initgraph (int far * graphdriver, int far * graphmode, char far * pathtodriver);
- •Void main ( )
- •Рассмотрим класс “ пятно”
- •Int size;
- •Void main ( )
- •Множественное наследование. Виртуальные базовые классы
- •Рассмотрим множественное наследование на примере.
- •Void show ()
- •Объект базового класса point дублируется:
- •Spotelli
- •Void show()
- •Void hide()
- •Void show()
- •Void hide()
- •Void main ( )
- •Class a { // самый верхний базовый класс а
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.
Для правильного построения конструктора производного класса необходимо иметь описание конструктора базового класса!