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

НАСЛЕДОВАНИЕ

Ключи доступа

При описании класса в его заголовке перечисляются все классы, являющиеся для него базовыми. Возможность обращения к элементам этих классов регулируется с помощью ключей доступа private, protected и public:

class имя : [private | protected | public] базовый класс

{тело класса}; Если базовых классов несколько, они перечисляются через запятую.

Ключ доступа может стоять перед каждым классом, например: class A {…};

class B {…}; class C {…};

class D: A, protected B, public C {…};

По умолчанию для классов используется ключ доступаprivate, а для структуры – public (см. табл. 1).

 

Связь ключей доступа и спецификаторов доступа

Таблица 1

 

 

 

 

 

 

 

 

 

Ключ

 

Спецификатор

Доступ в производ-

Комментарий

 

доступа

 

в производном

ном классе

 

 

 

 

 

классе

 

 

 

 

private

 

private

private

Все

элементы

 

 

protected

private

private

 

 

 

 

public

private

 

 

 

protected

 

private

private

Все

элементы

 

 

protected

protected

protected,

кроме

 

 

public

protected

private

 

 

public

 

private

private

Не изменяется

 

 

 

protected

protected

 

 

 

 

 

public

public

 

 

 

Из таблицы видно, что private элементы базового класса недоступны вне зависимости от ключа. Обращение к ним может осуществляться только через методы базового класса.

Простое наследование

Простым называется наследование, при котором производный класс имеет одного родителя. Для различных методов класса существуют разные правила наследования – например, конструкторы и операция присваивания в производном классе не наследуются, а деструкторы наследуются.

21

Пример. Описание класса daemon, производного от класса monstr: enum color {red, green, blue};

// monstr class monstr {

//

int health, ammo; color skin;

char * name; public:

//

monstr (int he=100, int am=10); monstr (color sk);

monstr (char *nam); monstr (monstr &M);

//

~ monstr ( ) {delete [ ] name;}

//

monstr & operator ++ ( ) { ++ health; return *this;

}

monstr operator ++ (int) { monstr M (*this);

health ++; return M;

}

operator int ( ) return health;

}

bool operator > (monstr &M) {

if (health > M.get_heath ( )) return true; return false;

22

}

const monstr & operator = (monsr &M) { if (&M == this) return *this;

if (name) delete [ ] name; if (M.name) {

namt = new char [strlen(M.name)+1]; strcpy (name, M.name); }

else name = 0;

health =M.health; ammj=M.ammo; skin =M.skin; return *this;

}

//

int get_health ( ) const {return health;} int get_ammo ( ) const { return ammo;}

//

void change_health (int he) {healt=he;}

//

void draw (int x, int y, int scale, int position);

//

monstr :: monstr (int he, int am):

health (he), ammo (am), skin (red), name (0) { } monstr :: monstr (monstr &M) {

if (M.name) {

name = new char [strlen(M.name)+1]; strcpy (name, M.name;}

else name = 0;

health =M.health; ammo=M.ammo; skin = M.skin;

}

monstr :: monstr (color sk) {

23

switch (sk) {

case red: health =100; ammo=10; skin = red; name=0; break;

case green: health =100; ammo=20, skin=green; name=0; break;

case blue: health =100; ammo=40; skin=blue; name=0; break;

}

}

monstr :: monstr (char * nam) { name = new char [strlen(nam)+1]; strcpy(name, nam);

health =100; ammo =10; skin = red;

}

void monstr :: draw (int x, int y, int scale, int position) {/**/}

//

class daemon : public monstr { int brain;

public:

//

daemon (int br=10) {brain = br;}

daemon (color sk) : monstr (sk) {brain = 10;} daemon (char *nam) : monstr (nam) {brain = 10;}

daemon (daemon &M) : monstr (M) {brain = M.brain;}

//

const daemon &operator = (daemon &M) { if (&M == this) return *this;

brain = M.brain;

24

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]