133.67K
Category: programmingprogramming

Программирование и основы алгоритмизации. Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм

1.

Программирование и основы алгоритмизации
Тема 5. Объектно-ориентированное
программирование. Наследование и
полиморфизм
Шевченко А. В.
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
1

2.

Программирование и основы алгоритмизации
Понятие абстракции
Абстракция в объектно-ориентированном программировании — это
выделение существенных характеристик объектов, которые отличают их
от всех других объектов, четко определяя концептуальные границы
каждого класса.
Шевченко А. В.
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
2

3.

Программирование и основы алгоритмизации
Классификация объектов по различным признакам
Шевченко А. В.
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
3

4.

Программирование и основы алгоритмизации
Иерархия абстрактного и конкретного
Конкретизация
Абстрагирование
Объект
Геометрическая
фигура
Плоская
Параллелограмм
Шевченко А. В.
Эллипс
Объемная
Цилиндр
Параллелепипед
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
4

5.

Программирование и основы алгоритмизации
Понятие наследования
Базовый класс
Производный класс
Наследование — важная составляющая концепции объектноориентированного программирования, благодаря которой возможно
создание новых классов на базе уже существующих.
Новые классы (производные) получают все элементы наследуемых
классов (базовых).
Шевченко А. В.
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
5

6.

Программирование и основы алгоритмизации
Простое и множественное наследования
Простое наследование
Базовый
класс
Производный
класс
Производный
класс
Множественное наследование
Базовый
класс
Базовый
класс
Производный
класс
При простом наследовании производный класс имеет только один
базовый класс. Базовый класс может иметь несколько производных
классов. Иерархия классов имеет вид дерева.
При множественном наследовании производный класс имеет несколько
родительских классов. Иерархия классов имеет вид ориентированного
графа.
Шевченко А. В.
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
6

7.

Программирование и основы алгоритмизации
Критерии «хорошей» иерархии классов
Критерий включения. Объекты производных классов должны обладать
всеми свойствами базовых классов.
Критерий независимости. Наследуемые свойства не должны
ограничивать использование собственных элементов производных
классов.
Критерий специализации. Если производный класс приводит к
специализации (ограничению) свойств базового класса, то это является
нарушением принципа независимости. Классы, которые отличаются
только специализацией, обычно составляют один уровень иерархии.
Критерий единства. Наследование и полиморфизм обеспечивают
единообразное выполнение аналогичных функций классов. Базовые
классы используются для создания интерфейса между классами и
«внешним миром».
Шевченко А. В.
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
7

8.

Программирование и основы алгоритмизации
Наследование в С++
Класс А
Класс В
Класс С
class A
{
...
};
class B
{
...
};
Шевченко А. В.
class C : public A, public B
{
...
};
Ограничение доступа при
наследовании
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
8

9.

Программирование и основы алгоритмизации
Ограничение доступа при наследовании
Атрибут доступа,
указанный при
наследовании
public
protected
private
Шевченко А. В.
Атрибут доступа
базового класса
Атрибут доступа
производного класса
public
public
protected
protected
private
private
public
protected
protected
protected
private
private
public
private
protected
private
private
private
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
9

10.

Программирование и основы алгоритмизации
Наследование и конструкторы
Конструкторы и деструкторы не наследуются. При создании объекта
производного класса наследуемые им данные должны инициироваться
конструктором базового класса. Если наследуются несколько базовых классов,
то их конструкторы вызываются явно конструктором производного класса или
компилятор инициирует вызов конструкторов по умолчанию в порядке
описания базовых классов.
Конструкторы производных классов могут передавать аргументы
конструкторам базовых классов.
Шевченко А. В.
Базовый класс
Конструктор
Деструктор
Производный класс
Конструктор
Деструктор
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
10

11.

Программирование и основы алгоритмизации
Пример наследования и использования конструкторов
Прямоугольник
Фигура
Круг
class Figure
{
protected:
TColor color;
public:
Figure(TColor Color);
TColor Color() { return(color); }
};
Figure::Figure(TColor Color)
{
color = Color;
}
Шевченко А. В.
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
11

12.

Программирование и основы алгоритмизации
Пример наследования (продолжение)
class Rectangle : public Figure
{
private:
float width;
float height;
public:
Rectangle(float Width, float Height, TColor Color);
float Area() { return(width*height); }
};
Rectangle::Rectangle(float Width, float Height, TColor Color) :
Figure(Color)
{
width = Width;
height = Height;
}
Шевченко А. В.
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
12

13.

Программирование и основы алгоритмизации
Пример наследования (продолжение)
class Circle : public Figure
{
private:
float radius;
public:
Circle(float Radius, TColor Color);
float Area() { return(M_PI*radius*radius); }
};
Circle::Circle(float Radius, TColor Color) : Figure(Color)
{
radius = Radius;
}
Шевченко А. В.
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
13

14.

Программирование и основы алгоритмизации
Полиморфизм
Понятие полиморфизма тесно связано с концепцией наследования. Оно
означает феномен различного выполнения одноименных функций в
разных классах.
Перегрузка функций и операторов также является одной из
составляющих полиморфизма.
Шевченко А. В.
Базовый класс
Метод Х
Производный класс
Метод Х
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
14

15.

Программирование и основы алгоритмизации
Пример переопределения методов в С++
Фигура
Прямоугольник
Площадь
Круг
Площадь
Площадь
Связывание объекта и метода
Статическое (раннее)
Шевченко А. В.
Динамическое (позднее)
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
15

16.

Программирование и основы алгоритмизации
Пример раннего связывания
class Figure
{
...
public:
float Area() { return(-1); }
};
class Rectangle : public Figure
{
...
public:
float Area() { return(width*height); }
}
class Circle : public Figure
{
...
public:
float Area() { return(M_PI*radius*radius); }
}
Шевченко А. В.
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
16

17.

Программирование и основы алгоритмизации
Пример раннего связывания
void main()
{
Figure f; Rectangle r(200, 100); Circle c(150);
ShowMessage(f.Area());
ShowMessage(r.Area());
ShowMessage(c.Area());
ShowMessage(r.Figure::Area());
ShowMessage(c.Figure::Area());
// метод класса Figure
// метод класса Rectangle
// метод класса Circle
// метод класса Figure
// метод класса Figure
Figure *fp = &f; Figure *rp = &r; Figure *cp = &c;
ShowMessage(fp->Area());
ShowMessage(rp->Area());
ShowMessage(cp->Area());
// метод класса Figure
// метод класса Figure
// метод класса Figure
Rectangle *rp1 = &r; Circle *cp1 = &c;
ShowMessage(rp1->Area());
ShowMessage(cp1->Area());
// метод класса Rectangle
// метод класса Circle
}
Шевченко А. В.
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
17

18.

Программирование и основы алгоритмизации
Пример позднего связывания
class Figure
{
...
public:
virtual float Area() { return(-1); }
};
class Rectangle : public Figure
{
...
public:
virtual float Area() { return(width*height); }
}
class Circle : public Figure
{
...
public:
virtual float Area() { return(M_PI*radius*radius); }
}
Шевченко А. В.
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
18

19.

Программирование и основы алгоритмизации
Пример позднего связывания
void main()
{
Figure f; Rectangle r(200, 100); Circle c(150);
ShowMessage(f.Area());
ShowMessage(r.Area());
ShowMessage(c.Area());
ShowMessage(r.Figure::Area());
ShowMessage(c.Figure::Area());
// метод класса Figure
// метод класса Rectangle
// метод класса Circle
// метод класса Figure
// метод класса Figure
Figure *fp = &f; Figure *rp = &r; Figure *cp = &c;
ShowMessage(fp->Area());
ShowMessage(rp->Area());
ShowMessage(cp->Area());
// метод класса Figure
// метод класса Rectangle
// метод класса Circle
Rectangle *rp1 = &r; Circle *cp1 = &c;
ShowMessage(rp1->Area());
ShowMessage(cp1->Area());
// метод класса Rectangle
// метод класса Circle
}
Шевченко А. В.
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
19

20.

Программирование и основы алгоритмизации
Чисто виртуальные методы
class Figure
{
...
public:
virtual float Area() = 0;
};
Чисто виртуальные методы не
имеют тела и предназначены для
задания интерфейса производных
классов.
class Rectangle : public Figure
{
...
public:
virtual float Area() { return(width*height); }
}
class Circle : public Figure
{
...
public:
virtual float Area() { return(M_PI*radius*radius); }
}
Шевченко А. В.
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
20

21.

Программирование и основы алгоритмизации
Абстрактные классы
class Figure
{
...
public:
virtual float Area() = 0;
};
void main()
{
Figure f;
...
}
Классы, которые включают хотя бы
один чисто виртуальный метод,
называются абстрактными. Для
абстрактных классов не могут быть
созданы объекты. Абстрактные
классы всегда находятся на вершине
иерархии классов и предназначены для
задания интерфейса и придания
иерархии единообразия.
[C++ Error] test.cpp(50): E2352 Cannot create instance of abstract
class 'Figure'
[C++ Error] test.cpp(50): E2353 Class 'Figure' is abstract because
of 'Figure::Area() = 0'
Шевченко А. В.
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
21

22.

Программирование и основы алгоритмизации
Конфликты при множественном наследовании
class A1
{
public:
int
void
};
class A2
{
public:
int
void
};
a;
Func();
a;
Func();
class B : public A1, public A2
{
...
};
Шевченко А. В.
void main()
{
B b;
b.a = 5;
b.Func();
b.A1::a = 6;
b.A1::Func();
b.A2::a = 7;
b.A2::Func();
}
//
//
//
//
//
//
Ошибка
Ошибка
Правильно
Правильно
Правильно
Правильно
Для устранения конфликтов имен
при множественном наследовании
используется оператор расширения
области видимости
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
22

23.

Программирование и основы алгоритмизации
Виртуальные базовые классы
class A
{
...
}
Класс A
Класс B
Класс C
Класс D
Шевченко А. В.
class B : virtual public A
{
...
}
class C : virtual public A
{
...
}
class D : public B, public C
{
...
}
Тема 5. Объектно-ориентированное программирование. Наследование и полиморфизм
23
English     Русский Rules