SlideShare a Scribd company logo
Программирование на языке C++
Лекция 4
Объектно-ориентированное программирование
Александр Смаль
1/8
Ещё раз об ООП
Объектно-ориентированное программирование — концпеция
программирования, основанная на понятиях объектов и
классов.
Основные принципы:
∙ инкапсуляция,
∙ наследование,
∙ полиморфизм,
∙ абстракция.
Подробнее о принципах проектирования ООП-программ можно
узнать по ключевым слову „шаблоны проектирования”.
2/8
Как правильно построить иерархию?
Иерархия геометрических фигур:
Shape
Triangle Circle Rectangle
Куда добавить класс Square?
3/8
Как правильно построить иерархию?
Квадрат — это прямоугольник, у которого все стороны равны.
Shape
Triangle Circle Rectangle
Square
void double_width(Rectangle & r) {
r.set_width(r.width () * 2);
}
4/8
Как правильно построить иерархию?
Прямоугольник задаётся двумя сторонами, а квадрат — одной.
Shape
Triangle Circle Square
Rectangle
double area(Square const& s) {
return s.width () * s.width ();
}
5/8
Как правильно построить иерархию?
Правильное решение — сделать эти классы независимыми:
Shape
Triangle Circle Rectangle Square
6/8
Агрегирование vs наследование
∙ Агрегирование — это включение объекта одного класса в
качестве поля в другой.
∙ Наследование устанавливает более сильные связи между
классами, нежели агрегирование:
∙ приведение между объектами,
∙ доступ к protected членам.
∙ Если наследование можно заменить легко на
агрегирование, то это нужно сделать.
Примеры некорректного наследования
∙ Класс Circle унаследовать от класса Point.
∙ Класс LinearSystem унаследовать от класса Matrix.
7/8
Принцип подстановки Барбары Лисков
Liskov Substitution Principle (LSP)
Функции, работающие с базовым классом, должны иметь
возможность работать с подклассами не зная об этом.
Этот принцип является важнейшим критерием при построении
иерархий наследования.
Другие формулировки
∙ Поведение наследуемых классов не должно противоречить
поведению, заданному базовым классом.
∙ Подкласс не должен требовать от вызывающего кода
больше, чем базовый класс, и не должен предоставлять
вызывающему коду меньше, чем базовый класс
8/8

More Related Content

Viewers also liked

4.6 Особенности наследования в C++
4.6 Особенности наследования в C++4.6 Особенности наследования в C++
4.6 Особенности наследования в C++
DEVTYPE
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателей
DEVTYPE
 
3.6 Константность
3.6 Константность3.6 Константность
3.6 Константность
DEVTYPE
 
6.2 Шаблоны функций
6.2 Шаблоны функций6.2 Шаблоны функций
6.2 Шаблоны функций
DEVTYPE
 
4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов
DEVTYPE
 
3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java
DEVTYPE
 
3.5 Модификаторы доступа
3.5 Модификаторы доступа3.5 Модификаторы доступа
3.5 Модификаторы доступа
DEVTYPE
 
6.1 Шаблоны классов
6.1 Шаблоны классов6.1 Шаблоны классов
6.1 Шаблоны классов
DEVTYPE
 
3.1 Структуры
3.1 Структуры3.1 Структуры
3.1 Структуры
DEVTYPE
 
4.2 Перегрузка
4.2 Перегрузка4.2 Перегрузка
4.2 Перегрузка
DEVTYPE
 
3.2 Методы
3.2 Методы3.2 Методы
3.2 Методы
DEVTYPE
 
4. Обработка ошибок, исключения, отладка
4. Обработка ошибок, исключения, отладка4. Обработка ошибок, исключения, отладка
4. Обработка ошибок, исключения, отладка
DEVTYPE
 
5.1 Перегрузка операторов
5.1 Перегрузка операторов5.1 Перегрузка операторов
5.1 Перегрузка операторов
DEVTYPE
 
5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе
DEVTYPE
 
3.8 Класс массива
3.8 Класс массива3.8 Класс массива
3.8 Класс массива
DEVTYPE
 
Квадратичная математика
Квадратичная математикаКвадратичная математика
Квадратичная математика
DEVTYPE
 
Программирование: теоремы и задачи
Программирование: теоремы и задачиПрограммирование: теоремы и задачи
Программирование: теоремы и задачи
DEVTYPE
 
6. Generics. Collections. Streams
6. Generics. Collections. Streams6. Generics. Collections. Streams
6. Generics. Collections. Streams
DEVTYPE
 
2.5 Ссылки
2.5 Ссылки2.5 Ссылки
2.5 Ссылки
DEVTYPE
 
2.7 Многомерные массивы
2.7 Многомерные массивы2.7 Многомерные массивы
2.7 Многомерные массивы
DEVTYPE
 

Viewers also liked (20)

4.6 Особенности наследования в C++
4.6 Особенности наследования в C++4.6 Особенности наследования в C++
4.6 Особенности наследования в C++
 
2.4 Использование указателей
2.4 Использование указателей2.4 Использование указателей
2.4 Использование указателей
 
3.6 Константность
3.6 Константность3.6 Константность
3.6 Константность
 
6.2 Шаблоны функций
6.2 Шаблоны функций6.2 Шаблоны функций
6.2 Шаблоны функций
 
4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов
 
3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java
 
3.5 Модификаторы доступа
3.5 Модификаторы доступа3.5 Модификаторы доступа
3.5 Модификаторы доступа
 
6.1 Шаблоны классов
6.1 Шаблоны классов6.1 Шаблоны классов
6.1 Шаблоны классов
 
3.1 Структуры
3.1 Структуры3.1 Структуры
3.1 Структуры
 
4.2 Перегрузка
4.2 Перегрузка4.2 Перегрузка
4.2 Перегрузка
 
3.2 Методы
3.2 Методы3.2 Методы
3.2 Методы
 
4. Обработка ошибок, исключения, отладка
4. Обработка ошибок, исключения, отладка4. Обработка ошибок, исключения, отладка
4. Обработка ошибок, исключения, отладка
 
5.1 Перегрузка операторов
5.1 Перегрузка операторов5.1 Перегрузка операторов
5.1 Перегрузка операторов
 
5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе
 
3.8 Класс массива
3.8 Класс массива3.8 Класс массива
3.8 Класс массива
 
Квадратичная математика
Квадратичная математикаКвадратичная математика
Квадратичная математика
 
Программирование: теоремы и задачи
Программирование: теоремы и задачиПрограммирование: теоремы и задачи
Программирование: теоремы и задачи
 
6. Generics. Collections. Streams
6. Generics. Collections. Streams6. Generics. Collections. Streams
6. Generics. Collections. Streams
 
2.5 Ссылки
2.5 Ссылки2.5 Ссылки
2.5 Ссылки
 
2.7 Многомерные массивы
2.7 Многомерные массивы2.7 Многомерные массивы
2.7 Многомерные массивы
 

More from DEVTYPE

Рукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебреРукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебре
DEVTYPE
 
1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства
DEVTYPE
 
1.3 Описательная статистика
1.3 Описательная статистика1.3 Описательная статистика
1.3 Описательная статистика
DEVTYPE
 
1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство
DEVTYPE
 
Continuity and Uniform Continuity
Continuity and Uniform ContinuityContinuity and Uniform Continuity
Continuity and Uniform Continuity
DEVTYPE
 
Coin Change Problem
Coin Change ProblemCoin Change Problem
Coin Change Problem
DEVTYPE
 
Recurrences
RecurrencesRecurrences
Recurrences
DEVTYPE
 
D-кучи и их применение
D-кучи и их применениеD-кучи и их применение
D-кучи и их применение
DEVTYPE
 
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыДиаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
DEVTYPE
 
ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ
DEVTYPE
 
Скорость роста функций
Скорость роста функцийСкорость роста функций
Скорость роста функций
DEVTYPE
 
Asymptotic Growth of Functions
Asymptotic Growth of FunctionsAsymptotic Growth of Functions
Asymptotic Growth of Functions
DEVTYPE
 
Кучи
КучиКучи
Кучи
DEVTYPE
 
Кодирование Хаффмана
Кодирование ХаффманаКодирование Хаффмана
Кодирование Хаффмана
DEVTYPE
 
Жадные алгоритмы: введение
Жадные алгоритмы: введениеЖадные алгоритмы: введение
Жадные алгоритмы: введение
DEVTYPE
 
Разбор задач по дискретной вероятности
Разбор задач по дискретной вероятностиРазбор задач по дискретной вероятности
Разбор задач по дискретной вероятности
DEVTYPE
 
Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"
DEVTYPE
 
Наибольший общий делитель
Наибольший общий делительНаибольший общий делитель
Наибольший общий делитель
DEVTYPE
 
Числа Фибоначчи
Числа ФибоначчиЧисла Фибоначчи
Числа Фибоначчи
DEVTYPE
 
О-символика
О-символикаО-символика
О-символика
DEVTYPE
 

More from DEVTYPE (20)

Рукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебреРукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебре
 
1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства
 
1.3 Описательная статистика
1.3 Описательная статистика1.3 Описательная статистика
1.3 Описательная статистика
 
1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство
 
Continuity and Uniform Continuity
Continuity and Uniform ContinuityContinuity and Uniform Continuity
Continuity and Uniform Continuity
 
Coin Change Problem
Coin Change ProblemCoin Change Problem
Coin Change Problem
 
Recurrences
RecurrencesRecurrences
Recurrences
 
D-кучи и их применение
D-кучи и их применениеD-кучи и их применение
D-кучи и их применение
 
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыДиаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
 
ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ
 
Скорость роста функций
Скорость роста функцийСкорость роста функций
Скорость роста функций
 
Asymptotic Growth of Functions
Asymptotic Growth of FunctionsAsymptotic Growth of Functions
Asymptotic Growth of Functions
 
Кучи
КучиКучи
Кучи
 
Кодирование Хаффмана
Кодирование ХаффманаКодирование Хаффмана
Кодирование Хаффмана
 
Жадные алгоритмы: введение
Жадные алгоритмы: введениеЖадные алгоритмы: введение
Жадные алгоритмы: введение
 
Разбор задач по дискретной вероятности
Разбор задач по дискретной вероятностиРазбор задач по дискретной вероятности
Разбор задач по дискретной вероятности
 
Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"
 
Наибольший общий делитель
Наибольший общий делительНаибольший общий делитель
Наибольший общий делитель
 
Числа Фибоначчи
Числа ФибоначчиЧисла Фибоначчи
Числа Фибоначчи
 
О-символика
О-символикаО-символика
О-символика
 

4.5 Объектно-ориентированное программирование

  • 1. Программирование на языке C++ Лекция 4 Объектно-ориентированное программирование Александр Смаль 1/8
  • 2. Ещё раз об ООП Объектно-ориентированное программирование — концпеция программирования, основанная на понятиях объектов и классов. Основные принципы: ∙ инкапсуляция, ∙ наследование, ∙ полиморфизм, ∙ абстракция. Подробнее о принципах проектирования ООП-программ можно узнать по ключевым слову „шаблоны проектирования”. 2/8
  • 3. Как правильно построить иерархию? Иерархия геометрических фигур: Shape Triangle Circle Rectangle Куда добавить класс Square? 3/8
  • 4. Как правильно построить иерархию? Квадрат — это прямоугольник, у которого все стороны равны. Shape Triangle Circle Rectangle Square void double_width(Rectangle & r) { r.set_width(r.width () * 2); } 4/8
  • 5. Как правильно построить иерархию? Прямоугольник задаётся двумя сторонами, а квадрат — одной. Shape Triangle Circle Square Rectangle double area(Square const& s) { return s.width () * s.width (); } 5/8
  • 6. Как правильно построить иерархию? Правильное решение — сделать эти классы независимыми: Shape Triangle Circle Rectangle Square 6/8
  • 7. Агрегирование vs наследование ∙ Агрегирование — это включение объекта одного класса в качестве поля в другой. ∙ Наследование устанавливает более сильные связи между классами, нежели агрегирование: ∙ приведение между объектами, ∙ доступ к protected членам. ∙ Если наследование можно заменить легко на агрегирование, то это нужно сделать. Примеры некорректного наследования ∙ Класс Circle унаследовать от класса Point. ∙ Класс LinearSystem унаследовать от класса Matrix. 7/8
  • 8. Принцип подстановки Барбары Лисков Liskov Substitution Principle (LSP) Функции, работающие с базовым классом, должны иметь возможность работать с подклассами не зная об этом. Этот принцип является важнейшим критерием при построении иерархий наследования. Другие формулировки ∙ Поведение наследуемых классов не должно противоречить поведению, заданному базовым классом. ∙ Подкласс не должен требовать от вызывающего кода больше, чем базовый класс, и не должен предоставлять вызывающему коду меньше, чем базовый класс 8/8