- •Наследование
- •Наследование классов
- •Классы 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 { // самый верхний базовый класс а
Множественное наследование. Виртуальные базовые классы
Класс является прямым базовым классом, если он входит в список базовых при определении производного класса.
А если сам базовый класс является производным от некоторого родителя, причем этот родитель не входит в список базовых классов, то этот родитель является непрямым (косвенным) базовым классом.
Иерархию производных классов принято отображать в виде направленного ациклического графа (НАГ), где стрелкой изображают связь “ производный от”.
Производные классы располагаются ниже базовых. В том же порядке они должны располагаться в программе и так их объявления рассматривает компилятор.
A (базовый класс – прямая база для B )
B (производный от А класс – прямая база для С )
С ( производный класс – с прямой базой В и косвенной А )
На практике часто возникает необходимость создать производный класс, наследующий возможности нескольких классов.
Наличие в определении производного класса несколько прямых базовых классов называют множественным наследованием.
class A { …} ;
class B {… } ;
class C { … };
class D : public A , public B , public C { . . . } ;
Родители перечисляются через запятую.
Как и в случае одиночного наследования, при создании объекта производного класса сначала конструируются объекты базовых классов ( в том порядке, в котором базовые классы перечислены в объявлении производного), и лишь после этого составляется объект производного класса.
Деструкторы выполняются в обратном порядке.
Рассмотрим множественное наследование на примере.
Класс “окружность, вписанная в квадрат”
Базовыми будит два класса : “ окружность” и “ квадрат ”.
// circ.cpp -определение класса “ окружность”
#include <graphics.h>
class circ {
int x , y , r ; // координаты центра и радиус окружности
public:
circ ( int xi, int yi , int ri )
{ x = xi ; y = yi ; r =ri ; }
void show( ) // изобразить окружность на экране
{ circle (x, y, r);}
void hide ( )
{int a ,b;
a= getbkcolor ( ); // функция возвращает цвет фона
b= getcolor ( ); // функция возвращает цвет символов и линий
setcolor (a);
circle (x, y, r); // рисуем окружность цветом фона
setcolor (b); // восстанавливаем цвет символов
}
void move ( int xn, int yn)
{ hide( );
x= xn; y= yn;
show(); }
} ;
// square.cpp - определение класса “ квадрат ”
#include <graphics.h>
class square {
int x, y , // координаты центра квадрата
len ; //длина стороны квадрата
public:
square(int xi, int yi , int li)
{ x = xi; y= yi ; len = li; }
void show ( )
{ int a = len/2;
rectangle (x-a, y-a, x+a, y+a);}
x-a x x+a
y-a
y
y+a
void hide ( )
{int a ,b; int t = len/2;
a= getbkcolor ( ); // функция возвращает цвет фона
b= getcolor ( ); // функция возвращает цвет символов и линий
setcolor (a);
rectangle (x-t, y-t, x+ t, y+ t); // рисуем квадрат цветом фона
setcolor (b); // восстанавливаем цвет символов
}
void move ( int xn, int yn)
{ hide( );
x= xn; y= yn;
show(); }
} ;
// множественное наследование
#include <conio.h.
#include ”circ.cpp”
#include “square.cpp”
class cirsqu: public circ, public square {
// производный класс двух базовых классов, нет своих данных
public:
cirsqu( int xi, int yi, int ri) : // конструктор, параметры для
// инициализации данных базовых классов
circ(xi, yi, ri), //явно вызываются конструкторы
square(xi, yi, 2*ri) { } // базовых классов
//так чтобы координаты центра окружности и квадрата совпадали,
// а сторона квадрата была равна диаметру окружности