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

Множественное наследование. Виртуальные базовые классы

Класс является прямым базовым классом, если он входит в список базовых при определении производного класса.

А если сам базовый класс является производным от некоторого родителя, причем этот родитель не входит в список базовых классов, то этот родитель является непрямым (косвенным) базовым классом.

Иерархию производных классов принято отображать в виде направленного ациклического графа (НАГ), где стрелкой изображают связь “ производный от”.

Производные классы располагаются ниже базовых. В том же порядке они должны располагаться в программе и так их объявления рассматривает компилятор.

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) { } // базовых классов

//так чтобы координаты центра окружности и квадрата совпадали,

// а сторона квадрата была равна диаметру окружности