- •1 Директиви препроцесора. Багатомодульне програмування
- •1.1 Мета роботи
- •1.2 Вказівки щодо організації самостійної роботи студентів
- •1.7 Контрольний приклад
- •2.1 Мета роботи
- •2.2 Вказівки щодо організації самостійної роботи студентів
- •2.6 Варіанти завдань
- •2.3 Порядок виконання роботи
- •2.4 Контрольні запитання та завдання
- •2.5 Завдання
- •2.7 Контрольний приклад
- •3 Файлові потоки мови с
- •3.1 Мета роботи
- •3.2 Вказівки щодо організації самостійної роботи студентів
- •Ввод и вывод символов
- •Ввод и вывод строк
- •Ввод и вывод записей
- •Управление указателем файла
- •Состояние потока
- •Форматированный вывод
- •Форматированный ввод
- •Другие функции форматного ввода и вывода
- •Примеры
- •3.3 Порядок виконання роботи
- •3.4 Контрольні запитання та завдання
- •3.5 Завдання
- •3.6 Варіанти завдань
- •3.7 Контрольний приклад
- •4 Перегрузка операцій
- •4.1 Мета роботи
- •4.2 Вказівки щодо організації самостійної роботи студентів
- •5.1 Мета роботи
- •5.2 Вказівки щодо організації самостійної роботи студентів Классы и объекты
- •Инкапсуляция
- •Конструктор
- •Деструктор
- •Указатели на объекты
- •Операции new и delete
- •5.3 Порядок виконання роботи
- •5.4 Контрольні запитання та завдання
- •5.5 Завдання
- •5.6 Варіанти завдань
- •5.7 Контрольний приклад
- •Уровни доступа
- •Виртуальные функции
- •Механизм работы виртуальных функций
- •Полиморфизм
- •Множественное наследование
- •6.7 Контрольний приклад
- •Рекомендована література
- •61166 Харків, просп. Леніна, 14.
Уровни доступа
Любой элемент класса имеет один из трех уровней доступа:
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, dear Bond".
Чтобы сделать метод виртуальным, достаточно объявить его с описателем virtual.
Для виртуальных функций действуют следующие правила:
виртуальную функцию нельзя объявлять как static; .
спецификатор virtual писать не обязательно при переопределении функции в производном классе, переопределенная функция все равно будет виртуальной.
виртуальная функция должна быть определена в классе, где она впервые объявлена или должна быть чисто виртуальной, т.е. не иметь кода.
virtual void print() = 0;
Класс, содержащий чисто виртуальные функции, является абстрактным, объекты такого класса не могут быть созданы. Единственным назначением абстрактных классов является “вынесение за скобки” общих свойств их потомков и обеспечение полиморфизма.
