1. Модуль 3: Основные понятия объектно-ориентированного
программирования.
Темы лекции: Композиция и наследование.
Практическое задание: Наследование классов.
Тренер: Игорь Шкулипа, к.т.н.
C++ Базовый. Занятие 10
2. http://www.slideshare.net/IgorShkulipa 2
Композиция классов
Композиция – механизм для создания нового класса путем
объединения нескольких объектов существующих классов в
единое целое.
При агрегировании между классами действует «отношение
принадлежности»
⚫ У машины есть кузов, колеса и двигатель
⚫ У человека есть голова, руки, ноги и тело
⚫ У треугольника есть вершины
Вложенные объекты обычно объявляются закрытыми (private)
внутри класса-агрегата
3. http://www.slideshare.net/IgorShkulipa 3
Пример. Треугольник
class Point
{
public:
Point(double x, double y);
double GetX();
double GetY();
private:
double _x, _y;
};
class Triangle
{
public:
Triangle(Point p1, Point p2, Point p3);
Point GetPoint(int index);
double GetArea();
private:
Point _p1, _p2, _p3;
};
4. http://www.slideshare.net/IgorShkulipa 4
Наследование
Наследование – это механизм ООП, позволяющий описать новый
класс на основе уже существующего.
При наследовании свойства и функциональность родительского
класса наследуются новым классом.
Класс-наследник имеет доступ к публичным (public) и
защищенным (protected) методам и полям класса
родительского класса.
Класс-наследник может добавлять свои данные и методы, а
также переопределять методы базового класса
5. http://www.slideshare.net/IgorShkulipa 5
Основные термины
Родительский или базовый класс (класс-родитель) – класс,
выступающий в качестве основы при наследовании.
Класс-потомок (дочерний класс, класс-наследник) – класс,
образованный в результате наследования от родительского
класса.
Иерархия наследования – отношения между родительским
классом и его потомками.
Интерфейс класса – совокупность публичных методов класса,
доступная для использования вне класса. В интерфейсной
части данные обычно не размещают.
Реализация класса – совокупность приватных методов и
данных класса
6. http://www.slideshare.net/IgorShkulipa 6
Виды наследования
По типу наследования:
◦ Открытое (public) наследование
◦ Закрытое (private) наследование
◦ Защищенное (protected) наследование
По количеству базовых классов:
◦ Одиночное наследование (один базовый класс)
◦ Множественное наследование (два и более базовых классов)
7. http://www.slideshare.net/IgorShkulipa 7
Открытое наследование
class Point
{
private: double _x, _y;
...
}
class Figure
{
protected: Point _center;
public: Point GetCenter();
}
class Circle: public Figure
{
private: double _radius;
public: double GetArea();
}
class Triangle: public Figure
{
private: Point _a, _b, _c;
public: double GetArea();
}
Figure
Circle Triangle
8. http://www.slideshare.net/IgorShkulipa 8
Закрытое наследование
При закрытом наследовании открытые и защищенные поля и
методы родительского класса становятся закрытыми полями и
методами производного.
class List
{
public:
void AddElement(double value);
void RemoveElement(double value);
protected:
ListNode* _list;
};
class Stack: private List
{
public:
void Push(double value);
double Pop();
};
9. http://www.slideshare.net/IgorShkulipa 9
Защищенное наследование
При закрытом наследовании открытые и защищенные поля и
методы родительского класса становятся защищенными
полями и методами производного. То есть эти поля доступны
для дальнейшего наследования
class List
{
public:
void AddElement(double value);
void RemoveElement(double value);
protected:
ListNode* _list;
};
class Stack: protected List
{
public:
void Push(double value);
double Pop();
};
10. http://www.slideshare.net/IgorShkulipa 10
Множественное наследование
Язык C++ допускает наследование класса от более, чем одного
базового класса.
Такое наследование называют множественным.
При этом порожденный класс может обладать свойствами сразу
нескольких родительских классов.
Например, класс может реализовывать сразу несколько
интерфейсов или использовать несколько реализаций.
(!) На практике множественное наследование лучше не
использовать.
11. http://www.slideshare.net/IgorShkulipa 11
Вызов конструкторов при наследовании
В C++ при конструировании экземпляра класса-наследника
всегда происходит предварительный вызов конструктора
базового класса.
В C++ вызов конструктора базового класса происходит до
инициализации полей класса наследника.
Конструктор класса-наследника может явно передать
конструктору базового класса необходимы параметры при
помощи списка инициализации.
Если вызов конструктора родительского класса не указан явно в
списке инициализации, то компилятор пытается вызвать
конструктор по умолчанию класса-родителя.
12. http://www.slideshare.net/IgorShkulipa 12
Вызов деструкторов при наследовании
В C++ деструкторы вызываются обратно порядку вызова
конструкторов.
Сначала вызывается деструктор класса-наследника, затем
деструктор базового класса и т.д. вверх по иерархии классов.
13. http://www.slideshare.net/IgorShkulipa 13
Перегрузка методов
В C++ метод производного класса замещает собой все методы родительского
класса с тем же именем
Количество и типы аргументов значения не имеют.
Для вызова метода родительского класса из метода класса наследника
используется обращение к методу базового класса с помощью операции «::»
class Base{
public:
void Print()
{ cout << "Base::Printn“; }
void Print(int param)
{ cout << "Base::Print " <<
param << "n“; }
};
class Derived : public Base {
public:
void Print(int param)
{
Base::Print(param);
cout << "Derived::Print " <<
param << "n";
}
};