
- •220300 - Системы автоматизированного проектирования
- •Тема 2. Технологии программирования
- •Тема 2. Технология разработки крупных приложений
- •Структуры
- •Структуры и функции
- •Массивы структур
- •Поиск в массиве структур
- •Вложенность структур
- •Рекурсия
- •Алгоритм быстрой сортировки
- •Массивы структур и бинарные файлы
- •Динамические структуры данных
- •Линейные списки
- •Очереди
- •Контрольная работа
- •Объектно-ориентированное программирование. Классы
- •Конструкторы
- •Перегруженные конструкторы
- •Определение методов класса вне класса
- •Объекты, возвращаемые функцией (методом)
- •Структуры и классы
- •Классы и память
- •Статические данные класса
- •Константные методы
- •Деструкторы
- •Массивы и классы
- •Массивы объектов
- •Строки Строковый тип или стандартный класс string
- •Тип строк AnsiString
- •Перегрузка операций
- •Перегрузка арифметических операций
- •Перегрузка операций сравнения
- •Перегрузка операции приведения типа
- •Преобразования объектов в основные типы и наоборот
- •Преобразование объектов классов в объекты других классов
- •Наследование
- •Конструкторы производного класса
- •Перегрузка функций
- •Иерархия классов
- •Общее и частное наследование. Комбинации доступа
- •Множественное наследование
- •Включение. Классы в классах
- •Виртуальные и дружественные функции
- •Абстрактные классы и чистые виртуальные функции
- •Виртуальные деструкторы
- •Виртуальные базовые классы или устранение неоднозначности при множественном наследовании
- •Дружественные функции
- •Дружественные классы
- •Указатель this
- •Многофайловые программы
- •Распознавание нажатых клавиш
Общее и частное наследование. Комбинации доступа
С++ предоставляет множество способов для точного регулирования доступа к членам класса. Рассмотрим пример-испытание классов, наследованных как public и private, показывающий какая комбинация будет работать, а какая нет.
class A { // базовый класс
private: // тип доступа к данным совпадает с типом
int privdataA; // доступа к функциям
protected:
int protdataA;
public:
int pubdataA;
};
///////////////////////////////////////////////////////////
class B : public A { // производный класс (общий наследник класса А)
public:
void funct ( ) {
int a;
a = privdataA; // ошибка, нет доступа
a = protdataA; // так можно
a = pubdataA; // так можно
}
};
///////////////////////////////////////////////////////////
class C : private A { // производный класс (частный наследник класса А)
public:
void funct ( ) {
int a;
a = privdataA; // ошибка, нет доступа
a = protdataA; // так можно
a = pubdataA; // так можно
}
};
///////////////////////////////////////////////////////////
int main ( ) {
int a;
B objB;
a = objB.privdataA; // ошибка, нет доступа
a = objB.protdataA; // ошибка, нет доступа
a = objB.pubdataA; // так можно
С objC;
a = objC.privdataA; // ошибка, нет доступа
a = objC.protdataA; // ошибка, нет доступа
a = objC.pubdataA; // ошибка, нет доступа
return 0;
}
Здесь, ещё раз показано, что методы производных классов имеют доступ к данным базового класса, объявленным как public или protected. Для объектов производных классов нет доступа к членам базового класса, объявленным как protected или private. Если объекты производных классов не пользуются методами базовых классов, то в этом случае нет надобности использовать общее наследование.
Производные классы могут являться базовыми классами для других производных классов:
class A
{ };
class B : public A // производный класса А
{ };
class C : public B { }; // производный класса В
Вопрос |
Допустим, что в предыдущей программе о служащих необходимо добавить производный класс Master от класса Worker, который имел-бы дополнителное поле "стаж". int main() { … Master mr("Krotov I.I.", 111, 1, 20); cout << "\nVyvod masterov: "; mr.show(); … } |
Ответ |
… class Master : public Worker { private: int stag; public: Master() : Worker() { } Master(char *mname, int mnum, int mr, int s) : Worker(mname, mnum, mr) { stag = s; } void getdata() { Worker::getdata(); cout << " Vvedite stag: "; cin >> stag; } void show() const { Worker::show(); cout << "\n Stag: " << stag; } };
|