
- •220300 - Системы автоматизированного проектирования
- •Тема 2. Технологии программирования
- •Тема 2. Технология разработки крупных приложений
- •Структуры
- •Структуры и функции
- •Массивы структур
- •Поиск в массиве структур
- •Вложенность структур
- •Рекурсия
- •Алгоритм быстрой сортировки
- •Массивы структур и бинарные файлы
- •Динамические структуры данных
- •Линейные списки
- •Очереди
- •Контрольная работа
- •Объектно-ориентированное программирование. Классы
- •Конструкторы
- •Перегруженные конструкторы
- •Определение методов класса вне класса
- •Объекты, возвращаемые функцией (методом)
- •Структуры и классы
- •Классы и память
- •Статические данные класса
- •Константные методы
- •Деструкторы
- •Массивы и классы
- •Массивы объектов
- •Строки Строковый тип или стандартный класс string
- •Тип строк AnsiString
- •Перегрузка операций
- •Перегрузка арифметических операций
- •Перегрузка операций сравнения
- •Перегрузка операции приведения типа
- •Преобразования объектов в основные типы и наоборот
- •Преобразование объектов классов в объекты других классов
- •Наследование
- •Конструкторы производного класса
- •Перегрузка функций
- •Иерархия классов
- •Общее и частное наследование. Комбинации доступа
- •Множественное наследование
- •Включение. Классы в классах
- •Виртуальные и дружественные функции
- •Абстрактные классы и чистые виртуальные функции
- •Виртуальные деструкторы
- •Виртуальные базовые классы или устранение неоднозначности при множественном наследовании
- •Дружественные функции
- •Дружественные классы
- •Указатель this
- •Многофайловые программы
- •Распознавание нажатых клавиш
Множественное наследование
Класс может быть производным не только от одного базового класса, а и от многих. Этот случай называется множественным наследованием. Синтаксис описания множественного наследования похож на синтаксис простого наследования:
class A // базовый класс
{ };
class B // базовый класс
{ };
class C : public A, public B // производный от классов А и В
{ };
В определённых ситуациях могут появиться некоторые проблемы, связанные со множественным наследованием. Допустим, что в обоих базовых классах существуют методы с одинаковыми именами, а в производном классе метода с таким именем нет. Как в этом случае объект производного класса определит, какой из методов базовых классов выбрать? Проблема решается путём использования оператора разрешения, определяющего класс, в котором находится метод.
class A {
public:
void show( ) { cout << "Класс A\n"; }
};
class B {
public:
void show( ) { cout << "Класс B\n"; }
};
class C : public A, public B {
};
///////////////////////////////////////////////////////////
int main ( ) {
C objC; // объект производного класса C
// objC.show ( ); // так делать нельзя – программа не скомпилируется
objC.A::show ( ); // так можно
objC.В::show ( ); // так можно
return 0;
}
Включение. Классы в классах
В ООП включение появляется, когда один объект является атрибутом другого объекта. Рассмотрим пример использования "включения" в классе Служащий:
class Sotrudnik {
private:
char name[L];
int number;
public:
void getdata() {
cout << "\n Vvedite FIO: "; cin.getline(name, L);
cout << " Vvedite nomer: "; cin >> number;
}
void show() const {
cout << "\n Familiya: " << name;
cout << "\n Nomer: " << number;
}
};
//---------------------------------------------------------------------------
class Worker {
private:
Sotrudnik s;
int raz;
public:
void getdata() {
s.getdata();
cout << " Vvedite razryad: "; cin >> raz;
}
void show() const {
s.show();
cout << "\n Razryad: " << raz;
}
};
//---------------------------------------------------------------------------
int main() {
Worker r1;
cout << "\nVvod workerov: "; r1.getdata();
cout << "\nVyvod workerov: "; r1.show();
getch(); return 0;
}
Д/З |
На основе стандартного типа int создайте класс Int, имеющий два конструктора, метод вывода на экран и метод для перегрузки арифметической операции +. Используя общее наследование, создайте производный класс, добавляющий возможность использования операции -. Напишите программу для проверки производного класса.
|
Ответ |
class Int { protected: int i; public: Int() { i=0; } Int(int d) { i=d; } void show() { cout << i; } Int operator+(Int b) { return (i+b.i); } }; class IntPr : public Int { public: IntPr() : Int() { } IntPr(int v) : Int(v) { } IntPr(Int a) : Int(a) { } // !!!!!!! необходимо, чтобы сработал метод базового Кл. //IntPr operator+(IntPr ii) { return Int::operator+(ii); } IntPr operator-(IntPr ii) { return (i-ii.i); } }; //--------------------------------------------------------------------------- int main() { IntPr i1(7), i2(3), res; res = i1 + i2; cout << "Summa = "; res.show(); res = i1 - i2; cout << "\nRaznost = "; res.show(); getch(); return 0; } |
Лекция 8 (14 стр.)