
- •Наследование
- •Иерархия классов
- •Переопределенные методы
- •Переопределенные методы
- •Переопределенные методы
- •Поля объектов в иерархии
- •классов
- •Переопределенные методы
- •Пример2 Иерархия классов наследования 12
- •Пример2 Иерархия классов наследования 14
- •Пример3 Иерархия классов наследования15
- •Пример3 Взаимодействие производных
- •Пример3 Иерархия ресурсоемких классов 21
- •Пример4 Иерархия ресурсоемких классов 24
- •Виртуальные функции
- •Виртуальные функции
- •Виртуальные функции
- •Пример2 Виртуальные переопределенные 29 функции классов при наследовании
- •Виртуальные функции
- •Виртуальные функции
- •Пример3 Виртуальные переопределенные 32 функции классов при наследовании
- •Пример4 Иерархия классов с
- •Пример4 Иерархия классов с
- •Пример4 Иерархия классов с

Наследование
Иерархия классов Переопределенные функции Виртуальные функции
ЛЕКЦИЯ №10

Иерархия классов |
2 |
|
Каждый класс может иметь производный класс, и этот класс, в свою очередь, может порождать другой производный класс. Таким образом формируются цепочки наследования или иерархии классов.
Тексты базовых классов размещаются в программе раньше, чем тексты производных классов.
Последовательность описаний классов может быть такой: class B { … };
class C : public B { … }; class D : public C { … };
В нашем примере класс С – базовый для D и производный от В. Для класса D базовыми являются и класс С, и класс В. Класс С есть прямой базовый класс для D, а класс В называют косвенным, или не прямым базовым классом для D.
Класс называется прямым базовым классом, если он является базовым при определении этого класса. Остальные предшествующие базовые классы называются косвенными, или не прямыми
базовыми классами

3
Переопределенные методы
В С++ несколько функций могут иметь одно и то же имя. В этом случае функция, задаваемая этим именем, называется перегруженной. Перегрузить можно только функции, которые отличаются либо типом, либо числом параметров
Переопределенный метод (функция) – это метод производного класса, который переопределяет доставшийся ему по наследству метод базового класса. То есть дает другую реализацию этого метода
Метод, объявленный в производном классе, является переопределенным (т.е. переопределяет метод, объявленный в базовом классе) только тогда, когда имеет то же имя и работает с тем же числом и типами параметров, что и метод в базовом классе

Переопределенные методы |
4 |
Пример иерархии классов с переопределенными методами
class A
{ protected : int a;
public :
void input()
{ cout << “ a=“ ; cin >> a; } int show() {return a;}
int showall() {return show();}
//на самом деле метод showall() имеет вид
//int showall() {return this->show();}, где А *this;
};
class B : public A
{
protected : int b;
public :
void input()
{cout << “ a=“ ; cin >> a; cout << “ b=“ ; cin >> b;
}
int show() {return b;}
};

Переопределенные методы |
5 |
|
|
Пример иерархии классов с переопределенными методами |
|
Продолжение |
|
class C : public B { protected :
int c; public :
void input()
{cout << “ a=“ ; cin >> a; cout << “ b=“ ; cin >> b; cout << “ c=“ ; cin >> c;
}
int show() { return c; }
};
void output1( A z)
{ cout << z.show () << endl; }
void output2( A & z)
{ cout << z.show () << endl; }
void output3( A * p)
{ cout << p -> show () << endl; }

Переопределенные методы |
6 |
|
|
||
Пример иерархии классов с переопределенными методами |
|
|
Вариант 2 |
|
|
class B : public A |
class C : public B |
|
{ protected : |
{ protected : |
|
int b; |
int c; |
|
public : |
public : |
|
void input () |
void input() |
|
{ A :: input(); |
{ B :: input(); |
|
cout << “ b=“ ; cin >> b; |
cout << “ c=“ ; cin >> c; |
|
} |
} |
|
int show () {return b;} |
int show() { return c; } |
|
}; |
}; |
|

Поля объектов в иерархии |
7 |
классов |
|
Объект типа А : |
Объект типа B : |
Объект типа C : |
|
a |
a |
a |
|
|
|
||
|
|
|
|
|
b |
b |
Подобъект типа B |
|
|
|
|
|
|
c |
|
Подобъект типа A |
|
|
|

классов
class А : |
|
|
|
class B : public A |
||
|
showall () |
|
|
|
showall () |
|
|
|
|
|
|
|
// из А |
|
|
|
|
|
|
|
|
show () |
|
|
|
show () |
|
|
|
|
|
|
|
// из А |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
show () |
|
|
input () |
|
|
|
||
|
|
|
|
|
// свой метод |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
input () |
|
|
|
|
|
|
||
|
|
|
|
|
|
// из А |
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
input () |
|
|
|
|
|
|
|
// свой метод |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8
class C : public B
showall ()
// из А
show ()
// из А
show ()
// из B
show ()
// свой метод
input ()
// из А input ()
// из B
input ()
// свой метод

Переопределенные методы |
9 |
Пример работы с переопределенными методами
void main ()
{ A aa; B bb; C cc;
// определяющим является тип объекта
aa.input(); |
// ввод a |
bb.input(); |
// ввод a и b |
cc.input(); |
// ввод a, b и c |
cout << aa.show() << endl; |
// вывод a |
cout << bb.show() << endl; |
// вывод b |
cout << cc.show() << endl; |
// вывод c |
//определяющим является
//тип указателя this ( A *this ) в методе showall()
cout << aa.showall() << endl; cout << bb.showall() << endl; cout << cc.showall() << endl;
//вывод a (вызов А::show() )
//вывод a (вызов А::show() )
//вывод a (вызов А::show() )
//определяющим является тип
//параметра функции
output1(aa); |
// вывод a |
output1(bb); |
// вывод a |
output1(cc); // вывод a
output2(aa); // вывод a output2(bb); // вывод a output2(cc); // вывод a
output3(&aa); |
// вывод a |
output3(&bb); |
// вывод a |
output3(&cc); |
// вывод a |
} // конец main() |
|

10
Пример2 Иерархия классов наследования с конструкторами и рядом методов
class point2 // точка на плоскости
{
protected:
double x; double y; public:
point2(double x0, double y0) : x(x0), y(y0) {}
point2( point2 &v) : x(v.x), y(v.y) {} void set(double x0, double y0)
{ x=x0; y=y0; }
void input(); void output();
double dist0(){ return sqrt(x*x+y*y); }
};
// метод вывода точки void point2::output()
{
cout<<“ x=“<<x
<<“ y=“<<y<<endl;
}
// метод ввода точки void point2::input()
{
cout<<“ x=“; |
cin> >x; |
cout<<“ y=“; |
cin>>y; |
}

11
Пример2 Иерархия классов наследования
Взаимодействие классов иерархии с базовыми классами
class point3 : public point2 |
// теперь прямой доступ к |
|||
// point3 наследник point2 |
// наследуемым полям есть |
|||
{ protected: |
|
|
|
|
double z; |
// радиус |
// метод вывода окружности |
||
public: |
|
void point3::output() |
||
point3() {} |
|
{ cout<<“ x=“<< x <<“ y=“<< y |
||
point3(double x0, double y0, double z0); |
<<“ z=“<< z <<endl; |
|||
point3( point2 p0, double z0); |
} |
|
||
// метод ввода окружности |
||||
point3(point3 & v); |
void point3::input() |
|||
void set(double x0, double y0, |
{ cout<<“ x=“; |
cin>> x ; |
||
double z0) { x =x0; y =y0; z=z0; } |
cout<<“ y=“; |
cin>> y ; |
||
void input(); |
void output(); |
|||
cout<<“ z=“; |
cin>>z; |
|||
double dist0(); |
||||
} |
|
|||
}; |
|
|
||
|
|
|