[ООП] Лекция 1
.pdfНаследование
Возможность создания иерархии классов, когда потомки наследуют все свойства предков, могут их изменять и добавлять новые свойства.
Выделение класса как некоторого понятия, охватывающего целый ряд различных объектов, также является абстракцией.
Иерархия наследования
Предок - надкласс или суперкласс Потомок - подкласс или субкласс
Объект
Животное |
Техн. устройство |
|
|
||
Млекопитающее |
Электронное устр. |
Трансп. средство |
|
||
Человек
Монитор Автомобиль
Студент
Полиморфизм
Возможность использовать в различных классах иерархии одно и то же имя для обозначения сходных по смыслу действий и гибко выбирать требуемое действие во время выполнения программы.
Возможность переопределения методов есть реализация полиморфизма.
Переопределение метода
Поиск метода, который вызывается в ответ на определенное сообщение, начинается с методов, принадлежащих классу получателя.
Поиск:
для методов класса -> найден ? да -> выполн. нет->
->для родительского класса->найден? да-> выполн. ( и далее вверх по цепочке) нет->
-> сообщение об ошибке
Если выше в иерархии классов существуют методы с тем же именем, что и текущий, то говорят, что данный метод переопределяет наследуемое поведение.
Абстракция
• С технической (.) зрения
Интерфейс (абстрагированная сущность объектов) + реализация (скрыта от пользователя)
•Выделение класса, как понятия
•Выделение существенных свойств объекта
Описание класса
class <имя> { [private:]
<описание скрытых элементов> public:
<описание доступных элементов>
};
Элементы класса – поля и методы.
Пример
#include <iostream.h> |
|
#include <string.h> |
Поля |
|
|
class student |
|
{ char fam[20],name[20]; |
|
int age; |
|
public: |
Встраиваемые методы |
void setdata (char *f, char *n, int a = 20) |
|
{ age = a; strcpy(fam, f); |
|
strcpy(name, n); |
|
} |
|
void show () |
|
{ cout << fam << ' ' << name << ' ' << |
age << endl; } |
}; |
|
Использование
int main () |
Описание объектов |
|
{student a, b ; a.setdata("Ivanov", "Boris");
b.setdata("Sokolova", "Olga", 19); a.show();
b.show(); |
Вызов методов |
student *s = new student; |
(передача сообщений) |
|
|
s-> setdata ("Ivanova", ”Maria"); |
|
return 0; |
|
}
Определение метода вне класса
void student :: setdata (char *f, char *n, int a)
{ age = a; strcpy(fam, f); strcpy(name, n);
}
Указатель this
Метод работает с полями того объекта, для которого он вызван. Для этого передается скрытый параметр this, содержащий константный указатель на объект.
student& student :: old (student &a) { if ( age > a.age ) return *this; return a;
}
…
student c = a.old(b); c.show();
