- •1 Перегрузка функций
- •Шаблоны функций
- •Void main()
- •3 Класс — как расширенное понятие структуры
- •4 Конструкторы, деструкторы и доступность компонентов класса
- •Void main ( )
- •5 Компонентные данные
- •7 Указатель this
- •Void main()
- •8 Друзья классов
- •9 Перегрузка стандартных операций
- •Void main ()
- •10 Простое наследование
- •11 Виртуальные функции и абстрактные классы
- •12 Абстрактные классы
- •13 Множественное наследование
- •Void main()
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 )
{…}
Деструктору производного класса, напротив, не требуется явно вызывать деструктор базового класса. В деструкторе производного класса компилятор автоматически генерирует вызовы базовых деструкторов.
