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

Int GetX() {return X;}

Int GetY(){return y;}

void SetX(int _x){x = _x;}

void SetY(int _y){y = _y;}

};

class OutCoord: public Coord

{

public:

OutCoord(int _x, int _y): Coord(_x,_y){}

int GetX(){return ++x;}

int GetY(){return ++y;}

Void ShowX(){cout « GetX() « ' ';}

Void ShowY(){cout « GetY()« ' ';}

};

main()

{

OutCoord* ptr;

ptr = new OutCoord(10,20); //Создание объекта в куче

ptr->ShowX() ;

ptr->ShowY();

cout « "\n";

delete ptr; //Удаление объекта из кучи

return 0;

}

В этом случае функции-члены ShowY () и ShowX () объекта ptr используют для получения значений данных-членов переоп­ределенные варианты функций базового класса GetX () и GetY (). В результате на экран программа выведет инкрементированные значения заданных координат.

Иногда возникает необходимость вызвать функцию-член ба­зового класса, а не ее переопределенный вариант, это можно сде­лать с помощью операции разрешения области видимости, при­меняемой в форме:

<имя_класса>: :<имя_члена>

Это дает возможность компилятору "видеть" за пределами те­кущей области видимости. Особенно часто это приходится делать при переопределении функций-членов. Переопределяемая функ­ция-член может вызывать соответствующую функцию-член базо­вого класса, а затем выполнять некоторую дополнительную рабо­ту (или наоборот). Например, в предыдущем примере можно бы­ло переопределить функцию GetX () следующим образом:

int

OutCoord::GetX()

{

int z;

//Вызов переопределенной функции

z = Coord::GetX();

return ++z;

}

Точно так же можно было бы использовать операцию разре­шения области видимости для квалификации вызываемой пере­груженной функции в ShowX ():

Void ShowX(){cout « Coord::GetX() « ' ';}

Производный класс сам может служить в качестве базового класса для некоторого другого класса. При этом исходный базо­вый класс называется косвенным базовым классом для второго базового класса.

Множественное наследование

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

Следующий пример демонстрирует множественное наследование.

#include <iostream.h>

#include <conio.h>

#include <string.h>

class Coord

{

int x, y;

public:

Coord(int _x, int _y){x = _x; у = _y;}

int GetX() {return x;}

int GetY() {return y;}

void SetX(int _x){x = _x;}

void SetY(int _y){y = _y;}

};

class SaveMsg

{

char Message[80];

public:

SaveMsg(char* msg){SetMsg(msg);}

void SetMsg(char* msg) {strcpy(Message, msg);}

void ShowMsg() {cout « Message;}

};

class PrintMsg: public Coord, public SaveMsg

{

public:

PrintMsg(int _x, int _y, char* msg): Coord(_x, _y), SaveMsg(msg){}

void Show();

};

void

PrintMsg::Show()

{

gotoxy(GetX() , GetY());

ShowMsg();

}

main()

{

PrintMsg * ptr;

ptr =new PrintMsg(10, 5, "Множественное ");

ptr->Show() ;

ptr->SetX(25);

ptr->SetY(5);

ptr->SetMsg("наследование");

ptr->Show();

delete ptr;

return 0;

}

В этом примере класс Coord отвечает за хранение и установ­ку значений координат на экране, класс SaveMsg хранит и уста­навливает сообщение, а класс PrintMsg, являющийся произ­водным от них, выводит это сообщение на экран в заданных ко­ординатах. Этот пример демонстрирует также, как осуществля­ется передача параметров конструкторам базовых классов. При множественном наследовании, как и при простом, конструкторы базовых классов вызываются компилятором до вызова конструк­тора производного класса. Единственная возможность передать им аргументы — использовать список инициализации элементов. Причем порядок объявления базовых классов при наследовании определяет и порядок вызова их конструкторов, которому должен соответствовать порядок следования конструкторов базовых классов в списке инициализации. В данном случае класс PrintMsg содержит такое объявление о наследовании:

class PrintMsg: public Coord, public SaveMsg

Этому объявлению соответствует следующий конструктор:

Соседние файлы в папке ЛекцииКарасева