

Инкапсуляция (1): использ. объекта (пример)
CPoint.h |
|
|
main.cpp |
|
#ifndef … |
|
|
|
|
#define … |
|
|
|
|
|
|
|
#include "CPoint.h" |
|
class CPoint |
{ |
|
|
|
private: |
|
… main (…) { |
||
int x,y,z; |
|
CPOINT |
||
|
|
|
CPoint a. |
(7,8,9); |
int Sum(); |
|
a.x = 10; //запрет доступа |
||
public: |
|
a.SetX(a.GetX()+1); |
||
CPoint(int |
_x, |
a.y = 12; //запрет доступа |
||
|
int |
_y, |
a.z = 14; |
|
|
int |
_z); |
a.Sum(); |
//запрет доступа |
void |
SetX(int _x); |
} |
|
|
int |
GetX(void); |
|
|
|
}; |
|
|
|
|
#endif
В каждую не-static ЭФ передается указатель this на обраб. объект
61

Наследование (2)
«Они называют расширение типа „наследованием“, но, вообще-то, наследство обычно переходит к потомку только тогда, когда предок умирает» (Н. Вирт)
Базовый К |
предок в самом начале иерархии |
|
|||
Косвенный БК |
предыдущий К в иерархии, не являющийся БК |
||||
Производный К |
потомок в иерархии |
|
|
||
Простое Н |
один |
БК/КБК |
A |
B |
|
Множественное Н |
несколько БК/КБК |
||||
|
|
ПК использует: |
C |
•не-private ЭД
•некоторые не-private ЭФ (не все наследуются)
с возможностью поведения (замена тела ЭФ) |
D |
|
62

Наследование (2): пример
|
|
БК: A |
|
|
|
ПК: B |
|
|
pri |
|
|
|
|
|
|
|
|
|
|
|
|
ЭД |
|
|
|
|
|
|
x |
|
|
|
time |
|
|
|
|
|
|
||
A |
|
|
|
|
|
|
ЭФ |
SetX |
|
|
|
B |
|
|
|
|
|
|||
|
|
|
|
|
|
|
B |
|
GetX |
|
|
|
SetT |
|
|
|
|
|
|
|
|
|
pri |
|
|
|
GetT |
A
class A { |
class B: public A { |
||
protected: |
protected: |
||
int x; |
int time; |
||
public: |
public: |
||
A(int _x); |
B(int _x, int _time): A(_x); |
||
void |
SetX(int); |
void |
SetT(int); |
int |
GetX(void); |
int |
GetT(void); |
}; |
|
}; |
63 |
|
|
|

Полиморфизм (3)
Одно название функции – множество реализаций
64

Полиморфизм (3) – виды и пример
1.Статический (см. выше)
2.Динамический – виртуальные функции
Пример
•Класс A – окружность, B (наследник А) – треугольник.
•p – указатель на А (БК), может указывать на объекты из иерархии (выбор объекта – RunTime).
Нужно обеспечить вызов соответствующий A::draw() или B::draw(). Проблема: A* p, будет всегда вызываться A::draw()
Решение |
virtual, vtable, vptr |
65

Сопровождение ЖЦ объекта
66

67

68

69

Деструктор
70