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

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

Язык С++ позволяет классу наследовать элементы данных и элементы функций одного или нескольких других классов. Новый класс —называют производным классом. Класс, элементы которого наследуются производным классом, называется базовым классом. В свою очередь, производный класс может служить базовым для другого класса.

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

Синтаксис наследования имеет следующий вид:

class Base

{ . . . };

class Derived : ключ_доступа Base [; ключ_доступа Base2, ...]

{ . . .};

Ключ_доступа не является обязательным и может быть private, protected или public. Если он не указан, доступ принимается по умолчанию private для классов и public для структур. При наследовании ключ доступа определяет уровень доступа к элементам базового класса внутри производного класса. В следующем примере В1 является общедоступным базовым классом для Derived, В2 является защищенным базовым классом для Derived и В3 является частным базовым классом для Derived.

class B1 {. . .};

class B2 { . . .};

class B3 { . . .};

class Derived : public B1, protected B2, private B3

{ . . . };

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

class Base

{public:

void f1( );

void f2( );

};

class Derived : private Base

{public:

Base :: f1; // Делает void Base :: f1( ) доступной как public

};

Простым наследованием называется, когда производный класс имеет всего один базовый класс. Следующий пример иллюстрирует простое наследование.

#include <stdio.h>

#include <conio.h>

#include <string.h>

const int MAX_LEN = 10;

class Coord // Coord : заключает в себе значения х и y.

{protected :

int x, y;

public :

Coord(int _x=0, int _y=0);

void SetLoc(int _x, int _y);

};

Coord::Coord(int _x,int _y) {SetLoc(_x, _y); } //Coord,конструктор

void Coord::SetLoc(int _x, int _y)//Coord::SetLoc:меняет значения x и y

{x = _x;y = _y;}

class MsgAtCoord:public Coord //MsgAtCoord : Содержит сообщение

// Наследует от Coord . . .

{char msg[MAX_LEN];

public :

MsgAtCoord( char *_msg = “NO MSG”);

void SetMsg( char *_msg); void Show( );

};

MsgAtCoord::MsgAtCoord(char*_msg) // MsgAtCoord : конструктор

{SetMsg( _msg );}

void MsgAtCoord::SetMsg(char*_msg) // записывает сообщение

{strcpy( msg, _msg );}

void MsgAtCoord :: Show( ) // выводит сообщение в точке x, y

{gotoxy(x, y); printf( msg );}

int main( void )

{MsgAtCoord greeting; greeting.SetLoc( 10, 10 );

greeting.SetMsg( “Hello . . . ” ); greeting.Show( );

return 0;

}

Конструкторы не наследуются. Если конструктор базового класса требует спецификации одного или нескольких параметров, то конструктор производного класса должен вызывать базовый конструктор, используя список инициализации элементов.

#include <string.h>

class Base

{public:

Base(int, floate);

};

class Derived : public Base

{public:

Derived( char *lst, float=1.00000 );

};

Derived::Derived( char *lst, float amt) : Base ( strlen(lst), amt )

{…}

Деструктору производного класса, напротив, не требуется явно вызывать деструктор базового класса. В деструкторе производного класса компилятор автоматически генерирует вызовы базовых деструкторов.

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