![Скачать презентацию С начала ООП Семинар 3 Рябова Анна Сергеевна Скачать презентацию С начала ООП Семинар 3 Рябова Анна Сергеевна](https://present5.com/wp-content/plugins/kama-clic-counter/icons/ppt.jpg)
07cb1cab600a174f684bb6602dd94233.ppt
- Количество слайдов: 11
С++, начала ООП Семинар 3 Рябова Анна Сергеевна ryabova. anna@gmail. com
Наследование o o o Расширение функциональности без копипаста Не испортим то, что уже работает Дети сохраняют поля и методы родителя
Наследование #include <string> #include<iostream> int main() { class Movie //Базовый класс { protected: std: : string title; int year; public: Movie(std: : string new. Title, int new. Year) : title(new. Title), year(new. Year) { } int get. Year() const { return year; std: : string get. Title() const }; { Movie movie 1("Senseless", 1998); movie 1. print. Info(); return 0; } } return title; } void print. Info() { std: : cout << "Movie " << title << "(" << year << ")" << std: : endl; }
Наследование class Serial : public Movie //Производный класс { int num. Series; public: Serial(std: : string new. Title, int new. Year, int nums) : Movie(new. Title, new. Year), num. Series(nums) { } int get. Num. Series() const {return num. Series; } void print. Info() { std: : cout << "Serial " << title << "(" << year << ")" << num. Series << " episodes"<< std: : endl; int main() } { }; Movie movie 1("Senseless", 1998); movie 1. print. Info(); Serial serial 1("House M. D. ", 2004, 135); serial 1. print. Info(); return 0; }
Множественное наследование У производного класса может быть несколько базовых class Coloured. Point : public Point, public Coloured. Item {. . . }; o Иерархия наследования o class Person { … }; class Student: public Person { … }; class 2 nd. Year. Student: public Student { … }; Student - непосредственный базовый класс (direct base), а Person – косвенный базовый класс (indirect base) 2 nd. Year. Student
Наследование: уровни доступа class C { private: class CPub: public C class CPro: protected C class CPri: private C { { { недоступно int a; protected: доступно как int b; protected public: доступно как int d; public } } доступно как protected } доступно как private }
Одноименные поля и методы Используется поле производного класса o Доступ к полю базового – через спецификатор доступа : : class Point { public: int x; int y; } class Relative. Point: public Point { public: int x; int direction; int get. Absolute. X() { return Point: : x + x; } } o
Виртуальные функции class Point { public: int x, y; Point(int _x, int _y) : x(_x), y(_y) {}; void show() { // рисуем точку } void hide() { // стираем точку } void move(int new_x, new_y) { // перемещаем из (x, y) в (new_x, new_y) hide(); x=new_x; y=new_y; show(); } }; o Методы move одинаковы Circle c(10, 5); Point p(20, 20); c. move(50, 50); //Circle: : move p. move(70, 70); //Point: : move class Circle : public Point protected: int r; public: Circle(int _x, int _y, int _r) : r(_r), Point(_x, _y) {}; void show() { // Вариант show для окружности } void hide() { // Вариант hide для окружности } void move(int new_x, int new_y) { hide(); x = new_x; y = new_y; show(); } };
Виртуальные функции class Point { public: int x, y; Point(int _x, int _y) : x(_x), y(_y) {}; virtual void show() { // рисуем точку } virtual void hide() { // стираем точку } void move(int new_x, new_y) { // перемещаем из (x, y) в (new_x, new_y) hide(); x=new_x; y=new_y; show(); } }; class Circle : public Point protected: int r; public: Circle(int _x, int _y, int _r) : r(_r), Point(_x, _y) {}; void show() { // Вариант show для окружности } void hide() { // Вариант hide для окружности } }; Circle c(10, 5); Point p(20, 20); c. move(50, 50); //Point: : move но с Circle: : hide, Circle: : show p. move(70, 70); //Point: : move
Виртуальные функции, полиморфизм o Указатель на производный класс может быть использован как указатель на базовый класс void move. Element(Point* pt, int delta_x, int delta_y) { pt->move(delta_x, delta_y); } int main() { Circle c; Point p; move. Element(&c); move. Element(&p); return 0; } o o Полиморфизм - способность объекта вести себя по разному в зависимости от того, как им пользуются. Использовать базовый класс вместо производного нельзя
Чисто виртуальные функции o Заранее известно, что метод базового класса вызываться не будет class Figure { public: virtual double area() { throw "error!"; } }; class Square: public Figure { double length; public: Square(double l): length(l) { } double area() { return length * length; } }; o o class Figure { public: virtual double area()= 0; }; class Circle: public Figure { double radius; public: Circle(double r): radius(r) { } double area() { return 3. 14159 * radius; } }; Если есть хоть один виртуальный метод, нельзя создать экземпляр класса Если нет полей, и все метод виртуальные – класс абстрактный
07cb1cab600a174f684bb6602dd94233.ppt