Прикладное программирование кафедра прикладной и компьютерной оптики Наследование.

Презентация:



Advertisements
Похожие презентации
Наследование Полиморфизм ВЫЗОВ КОНСТРУКТОРОВ И ДЕСТРУКТОРОВ ПРИ НАСЛЕДОВАНИИ.
Advertisements

Лекция 4. Введение в С++ Наследование, множественное наследование. Конструкторы, деструкторы. Виртуальные функции.
Лекция 8. Введение в ООП. Часть 1 Красс Александр СПбГУ ИТМО, 2008.
НГТУ, каф. ВТ Наследование в С++ Макаревич Л. Г.НГТУ, каф. ВТ Наследование в С++ Макаревич Л. Г.
Прикладное программирование кафедра прикладной и компьютерной оптики Абстрактные типы данных.
Объектно-ориентированное программирование С++. Лекция 6 Карпов В.Э.
НаследованиеНаследование2 class Point { double x; double y; Color color; }; class Radius { Point center; double radius; };
С++, начала ООП Семинар 3 Рябова Анна Сергеевна
Производные классы Определение класса посредством добавления возможностей к уже имеющемуся классу без перепрограммирования или перекомпиляции самого класса.
Наследование и полиморфизм. «Быть» или «Иметь» а так же «Точно» или «Как получится»
Наследование time time_with_sec В чем преимущества наследования? Наследование кода – поля, метод inc Появилось два класса с которыми точно можно обращаться.
©Павловская Т.А. Язык С++ Курс «С++. Программирование на языке высокого уровня» Павловская Т.А.
Прикладное программирование кафедра прикладной и компьютерной оптики Полиморфизм.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Множественное наследование class A {... }; class B {... }; class C : public A, protected B {... }; !!! Спецификатор доступа распространяется только на.
Лекция 16. Введение в ООП. Часть 7 Красс Александр СПбГУ ИТМО, 2008.
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
Лекция 11. Введение в ООП. Часть 4 Красс Александр СПбГУ ИТМО, 2008.
Лекция 13 Производные классы и открытое наследование. Подбельский гл , Страуструп гл , Мейрс пп Открытое наследование производного.
Интерфейсы Лекция 4. Реализуйте очередь в виде списка, содержащую комплексные числа Реализуйте методы void Enqueue(Complex с ) – помещает число в очередь.
Транксрипт:

Прикладное программирование кафедра прикладной и компьютерной оптики Наследование

2 Наследование – такое отношение между классами когда один из них наследует (повторяет) структуру и поведение другого cодержание (переменные-члены) поведение (функции-члены)

3 Пример наследования: линза и зеркало class Lens { Position m_p; Media m_media; double m_R1, m_R2; double m_d, m_D; }; class Mirror { Position m_p; double m_R; double m_D; };

4 Пример наследования: деталь // базовый класс class Detail { protected: Position m_p; double m_D; }; // класс-наследник class Lens : public Detail { private: Media m_media; double m_R1, m_R2; double m_d; }; // класс-наследник class Mirror : public Detail { private: double m_R; }; См. пример программы

5 Доступ к членам класса public (открытые) protected (защищенные) private (закрытые) функции-члены и друзья класса +++ функции-члены и друзья производных классов ++– пользователи+––

6 Типы наследования class X : public Y; наследник является подтипом и выполняет все обязательства родителя допустимо преобразование X* в Y* class X : private Y; наследник не будет подтипом родителя public и protected члены родителя станут private членами наследника преобразование X* в Y* допустимо для друзей и членов X последующее наследование не имеет смысла class X : protected Y; наследник не будет подтипом родителя public и protected члены родителя станут protected членами наследника преобразование X* в Y* допустимо для членов и друзей и наследников X

7 Доступ к переменным-членам базового класса public (открытые) protected (защищенные) private (закрытые) public-наследованиеpublicprotectedнедоступны protected-наследованиеprotected недоступны private-наследованиеprivate недоступны См. пример программы

8 Последовательность вызовов конструкторов и деструкторов При создании экземпляра класса Lens сначала вызовется конструктор базового класса Detail() потом конструктор класса Lens() При разрушении экземпляра класса Lens деструкторы будут вызваны в обратном порядке: сначала деструктор наследника ~Lens() потом деструктор базового класса ~Detail() В конструкторе наследника с параметрами следует вызывать конструктор базового класса (по умолчанию будет вызван конструктор базового класса без параметров) См. пример программы

9 Множественное наследование class Child : public Base1, public Base2 { public: Child(); ~Child(); }; при создании экземпляра класса Child: Base1(), Base2(), Child() при разрушении экземпляра класса Child: ~Child(), ~Base2(), ~Base1() class Base1 { public: Base1(); ~Base1(); }; class Base2 { public: Base2(); ~Base2(); };

10 Виртуальные функции Виртуальные функции – функции базового класса, которые можно заместить в каждом производном классе позволяют избавиться от переменных-членов, представляющих собой флаг или тип отвечающий за внутреннее строение класса всегда будет вызываться функция наследника

11 Виртуальная функция в базовом классе class Detail { public: virtual void print() const; }; ////////////////////////////////////////////// void main () { // виртуальные функции важны, когда создаются указатели на класс Detail *p=new Lens; } См. пример программы

12 Перегруженные функции в классах-наследниках Detail *l=new Lens; Если должны вызываться "родные" функции-члены классов, то используется обычная перегрузка l.print(); // Detail::print Если функция-член базового класса должна подменяться функцией-членом класса-наследника, то при ее объявлении используется модификатор virtual l.print(); // Lens::print Если должны вызываться последовательно обе функции, то это необходимо сделать принудительно вызвав функцию-член базового класса Detail::print();

13 Виртуальные деструкторы class Shape { public: Shape() { }; virtual ~Shape() { }; }; ////////////////////////// void main() { Shape* s=new Polygon();... delete s; } class Polygon : public Shape { private: Point* m_points; public: Polygon(int n) { m_points=new Point[n]; }; ~Polygon() { delete [] m_points; }; См. пример программы

14 Абстрактные классы Абстрактный класс – класс, имеющий чисто виртуальные функции чисто виртуальная функция – функция не определена в базовом классе, и обязательно должна быть перегружена в наследниках экземпляр абстрактного класса создать нельзя, но можно создать экземпляры его наследников // чисто виртуальный класс Деталь class Detail { protected: double m_z, m_D; public: //... // вычисление хода луча virtual void RayTrace() = 0; }; См. пример программы