7.Производные классы.pptx
- Количество слайдов: 20
7. Производные классы
7. 1. Производный класс Определяет тип, являющийся разновидностью другого типа Класс1 базовый ЕСТЬ НЕКОТОРЫЙ Класс2 производный 2
7. 2. Наследование Производный класс ЕСТЬ базовый плюс обязательно что-то свое Базовый класс состояние Производный класс методы состояние методы 3
7. 4. Производный класс Вопросы: – могут ли (и как) методы производного класса получить доступ к состоянию и методам базового класса – можно ли (и как) получить доступ к состоянию и методам базового класса через экземпляр производного класса 6
7. 4. Производный класс void D: : g() { x = 0; – ошибка! f(); g 1(); – методы базового класса y = 3; – состояние производного класса B: : y = 5; – состояние базового класса fd(); g(); – методы производного класса B: : g(); – метод базового класса } 7
7. 5. Тип наследования Уровень видимости в базовом классе private protected public Тип наследования private protected public private protected private protected public 8
7. 5. Тип наследования B ob 1; D ob 2; ob 1. f(); ob 2. f(); – ошибка! ob 2. fd(); – ошибка! ob 1. g(); ob 1. g 1(); – ok! ob 2. g 1(); – ok только для public наследования! ob 2. g(); – метод производного класса ob 2. B: : g(); – метод базового класса (только для public наследования) 9
7. 6. Пример Point Circle Окружность есть точка, имеющая некоторый размер Класс Окружность: • наследует состояние и методы базового класса Точка • должен определить собственные состояние и/или методы • может переопределить какието методы базового класса 10
7. 7. Тестирование классов Point p 1, p 2(1); Circle c 1(1), c 2(p 2); cout << p 2 << endl; (1, 1) cout << c 2 << endl; center: (1, 1), radius: 1 18
7. 7. Тестирование классов Point p 1, p 2(1); Circle c 1(1), c 2(p 2); float d; d = p 1. distance(p 2); d = c 1. distance(c 2); d = c 1. distance(p 2); d = p 1. distance(c 2); 1. 41421 19
7. 8. Организация ввода/вывода class Point {. . . protected: ostream &print(ostream &) const; friend ostream & operator <<(ostream &, const Point &); . . . }; 20
7. 8. Организация ввода/вывода ostream &Point: : print(ostream &os) const { return os << '(' << x << ", " << y << ')'; } ostream & operator <<(ostream &os, const Point &p) { return p. print(os); } 21
7. 8. Организация ввода/вывода class Circle: public Point {. . . protected: ostream &print(ostream &) const; friend ostream& operator <<(ostream &, const Circle &); . . . }; 22
7. 8. Организация ввода/вывода ostream & Circle: : print(ostream &os) const { os << "center: "; Point: : print(os); return os << ", radius: " << rad; } 23
7. 8. Организация ввода/вывода ostream & operator <<(ostream &os, const Circle &c) { return c. print(os); } 24
7. 9. Копирование class B { … public: B(const B&); … }; class D: public B { … }; void f(const D& d) { B b = d; // копирующий конструктор b = d; // присваивание … } Операторы присваивания не наследуются!!! 25
7. 10. Указатели на классы class B { … public: … void f(); … }; class D: public B { … public: … void f(); void f 1(); … }; 26
7. 10. Указатели на классы B b. Ob; D d. Ob; b. Ob. f(); d. Ob. f 1(); d. Ob. f(); B *b. Ptr = &b. Ob; D *d. Ptr = &d. Ob; b. Ptr->f(); (*b. Ptr). f(); d. Ptr->f 1(); d. Ptr->f(); b. Ob d. Ob b. Ptr d. Ptr 27
7. 10. Указатели на классы b. Ptr = &d. Ob; d. Ptr = &b. Ob; – ошибка!!! b. Ob d. Ob ? ? ? b. Ptr d. Ptr 28
7. 10. Указатели на классы b. Ptr = &d. Ob; b. Ob d. Ob b. Ptr->f(); – какой метод ? ? ? b. Ptr->f 1(); – что будет ? ? ? b. Ptr 29