Слайд 2
7.1. Производный класс
Определяет тип, являющийся
разновидностью другого типа
производный
базовый
ЕСТЬ НЕКОТОРЫЙ
Слайд 3
7.2. Наследование
Производный класс ЕСТЬ базовый плюс обязательно что-то
свое
Базовый класс
Производный класс
состояние
методы
состояние
методы
Слайд 4
7.3. Базовый класс
class B {
private:
int
x;
protected:
int y;
void f();
public:
void
g();
void g1();
};
Слайд 5
7.4. Производный класс
class D: тип наследования B
{
private:
int xd;
protected:
int y;
void
fd();
public:
void g();
};
Слайд 6
7.4. Производный класс
Вопросы:
могут ли (и как) методы производного
класса получить доступ к состоянию и методам базового класса
можно
ли (и как) получить доступ к состоянию и методам базового класса через экземпляр производного класса
Слайд 7
7.4. Производный класс
void D::g()
{
x = 0; –
ошибка!
f(); g1(); – методы базового класса
y =
3; – состояние производного класса
B::y = 5; – состояние базового класса
fd(); g(); – методы производного класса
B::g(); – метод базового класса
}
Слайд 9
7.5. Тип наследования
B ob1; D ob2;
ob1.f(); ob2.f(); –
ошибка!
ob2.fd(); – ошибка!
ob1.g(); ob1.g1(); – ok!
ob2.g1(); – ok
только для public наследования!
ob2.g(); – метод производного класса
ob2.B::g(); – метод базового класса (только для public наследования)
Слайд 10
7.6. Пример
Окружность есть точка, имеющая некоторый размер
Класс Окружность:
наследует
состояние и методы базового класса Точка
должен определить собственные состояние
и/или методы
может переопределить какие-то методы базового класса
Слайд 11
7.6.1. Класс Point
class Point {
private:
double x, y;
public:
Point():x(0), y(0)
{}
Point(double x0):x(x0), y(x0){}
Point(double x0, double y0):x(x0), y(y0){}
Слайд 12
7.6.1. Класс Point
double distance(const Point &p) const {
double
dx = x – p.x,
dy = y
– p.y;
return sqrt(dx*dx + dy*dy);
}
friend ostream & operator <<(ostream &, const Point &);
};
Слайд 13
7.6.1. Класс Point
ostream & operator
Point &p)
{
return os
" << p.y << ')‘;
}
Слайд 14
7.6.2. Класс Circle
class Circle : public Point {
private:
double
rad;
public:
Circle(double r = 0);
Circle(double x, double y, double r
= 1);
Circle(const Point &p, double r = 1);
Слайд 15
7.6.2. Класс Circle
int intersect (const Circle &c) const
{
return distance(c) < rad + c.rad;
}
friend ostream&
operator <<(ostream &, const Circle &);
};
Слайд 16
7.6.2. Класс Circle
Circle::Circle(double r):
Point(), rad(r){ }
Circle::Circle(double x, double
y, double r):
Point(x, y), rad(r){ }
Circle::Circle(const Point &p, double
r):
Point(p), rad(r){ }
Слайд 17
7.6.2. Класс Circle
ostream& operator
&c)
{
return os
radius: " << rad;
}
Слайд 18
7.7. Тестирование классов
Point p1, p2(1);
Circle c1(1), c2(p2);
cout
p2
1), radius: 1
Слайд 19
7.7. Тестирование классов
Point p1, p2(1);
Circle c1(1), c2(p2);
float d;
d
= p1.distance(p2);
d = c1.distance(c2);
d = c1.distance(p2);
d = p1.distance(c2);
1.41421
1.41421
1.41421
1.41421
Слайд 20
7.8. Организация ввода/вывода
class Point {
. . .
protected:
ostream &print(ostream
&) const;
friend ostream & operator
&);
. . .
};
Слайд 21
7.8. Организация ввода/вывода
ostream &Point::print(ostream &os) const
{
return os
<< ')';
}
ostream & operator <<(ostream &os, const Point &p)
{
return p.print(os);
}
Слайд 22
7.8. Организация ввода/вывода
class Circle: public Point {
. .
.
protected:
ostream &print(ostream &) const;
friend ostream& operator
Circle &);
. . .
};
Слайд 23
7.8. Организация ввода/вывода
ostream & Circle::print(ostream &os) const
{
os
"center: ";
Point::print(os);
return os
rad;
}
Слайд 24
7.8. Организация ввода/вывода
ostream & operator
Circle &c)
{
return c.print(os);
}
Слайд 25
7.9. Копирование
class B {
…
public:
B(const B&);
…
};
class D: public B
{
…
};
void f(const D& d)
{
B b = d; // копирующий конструктор
b = d; // присваивание
…
}
Операторы присваивания не наследуются!!!
Слайд 26
7.10. Указатели на классы
class B {
…
public:
…
void f();
…
};
class
D: public B {
…
public:
…
void f();
void f1();
…
};
Слайд 27
7.10. Указатели на классы
B bOb;
D dOb;
bOb.f();
dOb.f1();
dOb.f();
B
*bPtr = &bOb;
D *dPtr = &dOb;
bPtr->f(); (*bPtr).f();
dPtr->f1();
dPtr->f();
Слайд 28
7.10. Указатели на классы
bPtr = &dOb;
dPtr = &bOb;
– ошибка!!!
bOb
dOb
bPtr
dPtr
???