
- •Доступ к наследуемым членам.
- •Статусы доступа при наследовании классов
- •Начальная часть таблицы, выводимой по этой программе, имеет вид:
- •Полиморфизм. Механизм виртуальных функций. Привести примеры.
- •34. Абстрактный класс. Чисто виртуальные функции
- •36. Шаблоны классов. Форматы описания шаблона класса, методов и объектов шаблонного класса.
- •Жизненный цикл программы.
Порождение классов в С++. Доступ к наследуемым членам. Статусы доступа при наследовании классов. Привести примеры.
При общем наследовании порожденный класс имеет доступ к наследуемым членам базового класса с видимостью public и protected. Члены базового класса с видимостью private – недоступны.
Общее наследование означает, что порожденный класс – это подтип базового класса. Таким образом, порожденный класс представляет собой модификацию базового класса, которая наследует общие и защищенные члены базового класса.
Пример
class student {
protected:
char fac[20];
char spec[30];
char name[15]; public:
student(char *f, char *s, char *n);
void print(); }; class grad_student : public student {
protected:
int year;
char work[30]; public:
grad_student(char *f, char *s, char *n, char *w, int y);
void print(); };
Порожденный класс наследует все данные класса student, имеет доступ кprotected и public-членам базового класса. В новом классе добавлено два член-данных, и порожденный класс переопределяет функцию print().
student :: student(char *f, char *s, char *n) {
strcpy(fac, f);
strcpy(spec, s);
strcpy(name, n); } grad_student :: grad_student(char *f, char *s, char *n, char *w, int y) :
student(f,s,n) {
year = y;
strcpy(work, w); }
Конструктор для базового класса вызывается в списке инициализации. Перегрузка функции print().
void student :: print() { cout << endl << "fac: " << fac << " spec: " << spec << " name: " << name; } void grad_student :: print() { student :: print(); cout << " work: " << work << " year: " << year; } int main() {
system("chcp 1251");
system("cls");
student s("МТ", "АМСП", "Сидоров Иван");
grad_student stud("ПС", "УиТС", "Иванов Петр", "Метран", 2000);
student *p = &s;
p->print();
grad_student *gs = &stud;
student *m;
gs->print();
m = gs;
m->print();
cin.get();
return 0; }
Результат
выполнения
Указатель на порожденный класс может быть неявно передан в указатель на базовый класс. При этом переменная-указатель m на базовый класс может указывать на объекты как базового, так и порожденного класса.
Указатель на порожденный класс может указывать только на объекты порожденного класса.
Неявные преобразования между порожденным и базовым классами называются предопределенными стандартными преобразованиями:
объект порожденного класса неявно преобразуется к объекту базового класса.
ссылка на порожденный класс неявно преобразуется к ссылке на базовый класс.
указатель на порожденный класс неявно преобразуется к указателю на базовый класс.
Доступ к наследуемым членам.
Доступ извне.
Доступными являются лишь элементы с атрибутом public.
Собственные члены класса.
Доступ регулируется только атрибутом доступа, указанным при описании класса.
Наследуемые члены класса.
Доступ определяется атрибутами доступа базового класса, ограничивается атрибутом доступа при наследовании и изменяется явным указанием атрибута доступа в производном классе.
Пример.
class Basis
{
public:
int a;
protected:
int b, c;
};
class Derived : public Basis
{
public:
Basis::c;
};
int main (void)
{
Basis ob;
Derived od;
ob.a; // правильно
ob.b; // ошибка
od.c; // правильно
od.b; // ошибка
return 0;
}
Доступ изнутри.
Собственные члены класса.
private и protected члены класса могут быть использованы только функциями-членами данного класса.
Наследуемые члены класса.
private-члены класса могут использоваться только собственными функциями- членами базового класса, но не функциями членами производного класса.
protected или public члены класса доступны для всех функций-членов. Подразделение на public, protected и private относится при этом к описаниям, приведенным в базовом классе, независимо от формы наследования.
Пример
class Basis
{
public:
void f1(int i)
{
a = i;
b = i;
}
int b;
private:
int a;
};
class Derived : private Basis
{
public:
void f2(int i)
{
a = i; // ошибка
b = i; // правильно
}
};
Статусы доступа при наследовании классов
Механизм наследования позволяет определять новые классы на основе уже имеющихся. Класс, на основе которого создается новый класс, называют базовым (родительским), а новый – производным (наследником). При наследовании важную роль играет статус доступа к компонентам класса.
Используются следующие соглашения:
– private-компоненты доступны только внутри того класса, в котором они определены;
– protected-компоненты доступны внутри того класса, в котором они определены, а также во всех производных классах;
– public-компоненты видны во всех частях программы.
При описании можно изменить статус доступа к наследуемым компонентам (только в направлении ужесточения). Формат описания производного класса с единичным наследованием имеет вид:
class имя_производного_класса: [модификатор] имя_базового_класса
{компоненты_производного_класса};
31. Создание многомодульного проекта.
32. Классы ввода/вывода в С++. Примеры использования. Классы ввода-вывода образуют иерархию по принципу наследования. Базовым в этой иерархии является класс ios (исключение составляют лишь классы буферизированных потоков). В классе ios объединены базовые данные и методы для ввода-вывода. Прямыми потомками класса ios являются классы istream и ostream. Класс istream — это класс входных потоков; ostream — класс выходных потоков. Потомком этих двух классов является iostream — класс двунаправленных потоков ввода-вывода. Объект cout принадлежит к классу ostream и представляет собой поток вывода, связанный с дисплеем. Объект cin принадлежит классу istream и является потоком ввода, связанным с клавиатурой. Оба эти объекта наследуются классом iostream.
Знак << обозначает перегруженную операцию вставки символов в поток вывода cout, а >> — знак операции извлечения из потока ввода cin.
Для организации форматированного потокового ввода-вывода в Си++ существуют два средства:
• применение функций-членов класса ios для управления флагами форматирования;
• применение функций-манипуляторов.
В следующей программе вычисляется и выводится на экран таблица значений функций sin x и cos x на п шагах в интервале от 0 до р. Для форматирования таблицы результатов используются манипуляторы.