Similar presentations:
Программирование и основы алгоритмизации. Тема 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