- •ВВЕДЕНИЕ
- •КЛАССЫ
- •Описание объектов
- •Указатель this
- •Конструкторы
- •Конструктор копирования
- •Статические элементы класса
- •Статические методы
- •Дружественные функции и классы
- •Дружественные функции
- •Дружественный класс
- •Деструкторы
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •НАСЛЕДОВАНИЕ
- •Ключи доступа
- •Простое наследование
- •Правила наследования методов
- •Абстрактные классы
- •ОБРАБОТКА ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ
- •Синтаксис исключений
- •Перехват исключений
- •Список исключений
- •Иерархии исключений
- •СТАНДАРТНАЯ БИБЛИОТЕКА
- •Форматирование данных
- •Флаги и форматирующие методы
- •Манипуляторы
- •Методы обмена с потоком
- •Файловые потоки
- •СТРОКИ
- •Операции
- •Функции
- •Преобразование строк
- •Поиск подстрок
- •Сравнение частей строк
- •Получение характеристик строк
- •КОНТЕЙНЕРНЫЕ КЛАССЫ
- •Последовательные контейнеры
- •Векторы
- •Двусторонние очереди
- •Списки
- •Ассоциативные контейнеры
- •Словари
- •Словари с дубликатами (multimap)
- •ПРИЛОЖЕНИЕ 1. ШАБЛОНЫ ФУНКЦИЙ
- •ПРИЛОЖЕНИЕ 2. ШАБЛОНЫ КЛАССОВ
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК
НАСЛЕДОВАНИЕ
Ключи доступа
При описании класса в его заголовке перечисляются все классы, являющиеся для него базовыми. Возможность обращения к элементам этих классов регулируется с помощью ключей доступа 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