![](/user_photo/2706_HbeT2.jpg)
- •Методичні вказівки
- •1 Директивипрепроцесора. Багатомодульне програмування
- •1.1 Мета роботи
- •1.2 Вказівки щодо організації самостійної роботи студентів
- •1.3 Порядок виконання роботи
- •1.4 Контрольні запитання та завдання
- •1.5 Завдання
- •1.6 Варіанти завдань
- •1.7 Контрольний приклад
- •2.1 Мета роботи
- •2.2 Вказівки щодо організації самостійної роботи студентів
- •2.3 Порядок виконання роботи
- •2.4 Контрольні запитання та завдання
- •2.5 Завдання
- •2.6 Варіанти завдань
- •2.7 Контрольний приклад
- •3 Файлові потоки мови с
- •3.1 Мета роботи
- •3.2 Вказівки щодо організації самостійної роботи студентів
- •Ввод и вывод символов
- •Ввод и вывод строк
- •Ввод и вывод записей
- •Управление указателем файла
- •Состояние потока
- •Форматированный вывод
- •Форматированный ввод
- •Другие функции форматного ввода и вывода
- •Примеры
- •3.3 Порядок виконання роботи
- •3.4 Контрольні запитання та завдання
- •3.5 Завдання
- •3.6 Варіанти завдань
- •3.7 Контрольний приклад
- •4 Перегрузка операцій
- •4.1 Мета роботи
- •4.2 Вказівки щодо організації самостійної роботи студентів
- •4.3 Порядок виконання роботи
- •5.1 Мета роботи
- •5.2 Вказівки щодо організації самостійної роботи студентів Классы и объекты
- •Инкапсуляция
- •Конструктор
- •Деструктор
- •Указатели на объекты
- •Операции new и delete
- •5.3 Порядок виконання роботи
- •5.4 Контрольні запитання та завдання
- •5.5 Завдання
- •5.6 Варіанти завдань
- •5.7 Контрольний приклад
- •6 Наслідування, поліморфізм, інкапсуляция
- •6.1 Мета роботи
- •6.2 Вказівки щодо організації самостійної роботи студентів
- •Наследование
- •Уровни доступа
- •Виртуальные функции
- •Механизм работы виртуальных функций
- •Полиморфизм
- •Множественное наследование
- •6.3 Порядок виконання роботи
- •6.4 Контрольні запитання та завдання
- •6.5 Завдання
- •6.6 Варіанти завдань
- •6.7 Контрольний приклад
- •Рекомендована література
- •61166 Харків, просп. Леніна, 14.
6 Наслідування, поліморфізм, інкапсуляция
6.1 Мета роботи
6.2 Вказівки щодо організації самостійної роботи студентів
Наследование
Производный класс (наследник) может получать атрибуты и поведение уже существующего базового класса. Наследование позволяет “вынести за скобки” то общее, что присуще нескольким классам — общие свойства придаются базовому классу, а отличия — его наследникам.
Пример базового и производного классов:dateиbirthday.
class
date {
int
day, month, year;
public:
date(int,int,int);
date(char*);
};
class
birthday: public date {
public:
string
name;
};
Конструкторы не наследуются. Если конструктор базового класса имеет параметры, он вызывается в списке инициализации производного конструктора. Конструктор без параметров вызывается автоматически.
Деструктор класса-наследника всегда вызывает деструктор базового класса.
Уровни доступа
Любой элемент класса имеет один из трех уровней доступа:
private(закрытый) – доступен только из функций-членов данного класса и дружественных функций;
protected(защищенный) – доступен какprivate, а также из функций-членов производных классов;
public(открытый) – доступен всюду, где виден класс.
В объявлении класса обычно сначала перечисляются все открытые элементы, потом защищенные, потом закрытые.
В заголовке производного класса указываются имена всех базовых классов вместе со спецификаторами доступа.
class Derived: сп_доступа Base1 [, сп_доступа Base2,...] {...};
Замечание. Базовых классов больше одного, если наследование множественное.
Спецификаторы определяют уровень доступа к элементам базового класса внутри производного. Уровень доступа к элементу определяется как меньший из двух - того, что элемент имеет внутри базового класса и того, что указан в производном классе (private<protected<public).
Явное указание спецификатора доступа при наследовании не обязательно. По умолчанию принимается private для базовых классов и public для базовых структур и объединений.
Если базовый класс наследуется как private, его публичные элементы будут иметь уровень private в производном классе. Однако можно выборочно вернуть статус публичных некоторым элементам базового класса, переобъявив их в секции public производного класса.
Пример. Возврат утраченного статуса.
class
Base {
public:
void
f1();
};
class
Derived: private Base {
public:
Base::f1;
// делает f1() снова публичным
};
Если элемент описан в базовом классе как private, его никак нельзя сделатьpublicв производном классе.
Виртуальные функции
Виртуальные функции позволяют уже в базовом классе вызывать функции, которые будут определены позже в производных классах.
Пример. Класс с виртуальными функциями.
Определим базовый класс date
class
date {
protected:
int
day, month, year;
public:
date(int,int,int);
void
set_year(int y);
void
print();
};
date::date(int
d, int m, int y)
{
day
= d; month = m; year = y;
}
void
date::set_year(int y)
{
year
= y;
print();
}
void
date::print()
{
printf("%d-%d-%d\n",
day, month, year);
}
и производный от него класс birthday:
class
birthday: public date {
public:
char
name[80];
birthday(int
d, int m, int y, char* n);
void
print();
};
birthday::birthday(int
d, int m, int y, char* n) : date(d, m, y)
{
strcpy(name,
n);
}
void
birthday::print()
{
printf("%d-%d-%d,
dear %s\n", day, month, year, name);
}
Следующий код
date*
d = new date(19, 10, 1951);
birthday*
b = new birthday(19, 10, 1951, "Bond");
d->set_year(2001);
b->set_year(2001);
напечатает: "19-10-1951" два раза.
Если же сделать метод date::print() виртуальным,
virtual
void print(int y);
то тот же код напечатает:
"19-10-1951"
"19-10-1951, dearBond".
Чтобы сделать метод виртуальным, достаточно объявить его с описателем virtual.
Для виртуальных функций действуют следующие правила:
виртуальную функцию нельзя объявлять как static; .
спецификатор virtual писать не обязательно при переопределении функции в производном классе, переопределенная функция все равно будет виртуальной.
виртуальная функция должна быть определена в классе, где она впервые объявлена или должна быть чисто виртуальной, т.е. не иметь кода.
virtual void print() = 0;
Класс, содержащий чисто виртуальные функции, является абстрактным, объекты такого класса не могут быть созданы. Единственным назначением абстрактных классов является “вынесение за скобки” общих свойств их потомков и обеспечение полиморфизма.