Программирование и основы алгоритмизации Тема 6.

Скачать презентацию Программирование и основы алгоритмизации Тема 6. Скачать презентацию Программирование и основы алгоритмизации Тема 6.

Тема 6. ООП. Наследование и полиморфизм.ppt

  • Количество слайдов: 23

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

>  Программирование и основы алгоритмизации      Пример раннего связывания Программирование и основы алгоритмизации Пример раннего связывания 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); } } Шевченко А. В. Тема 6. Объектно-ориентированное программирование. Наследование и полиморфизм 16

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

>  Программирование и основы алгоритмизации      Пример позднего связывания Программирование и основы алгоритмизации Пример позднего связывания 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); } } Шевченко А. В. Тема 6. Объектно-ориентированное программирование. Наследование и полиморфизм 18

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

>  Программирование и основы алгоритмизации      Чисто виртуальные методы Программирование и основы алгоритмизации Чисто виртуальные методы 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); } } Шевченко А. В. Тема 6. Объектно-ориентированное программирование. Наследование и полиморфизм 20

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

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

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