 
											 
											 
											 
											 
											 
											 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					 
					ЛЕКЦИЯ 27
Полиморфизм.. 1
Раннее связывание. 1
Виртуальные функции. Позднее связывание. 8
Шаблоны.. 16
Пример шаблона семейства функций. 16
Класс в качестве перегружаемого параметра функции. 16
Шаблон класса. 18
Организация исходного кода в программе с шаблонами классов. 21
Шаблоны семейства классов с одним параметром шаблона. 22
Пример шаблона классов «очередь» на основе массива. 22
Пример шаблона классов с одним параметром шаблона для создания динамических массивов. 23
Шаблоны семейства классов с двумя параметрами шаблона. 28
Пример шаблона классов для создания статического массива. 28
Пример класса-шаблона «массив с проверкой выхода за границы». 30
Шаблоны семейства классов с несколькими параметрами шаблона. 32
Пример шаблона классов для создания массива с использованием в качестве параметров типа элементов массива, типа индексов и размера массива. 32
Передача объектов класса-шаблона как параметров. 34
Параметры шаблона, задаваемые по умолчанию.. 35
Специализация шаблона-класса. 35
Статические элементы в шаблонах. 37
Потомки шаблонов семейства классов. 39
На предыдущей лекции мы рассмотрели совокупность объектов:


 Location
       Point              Square 
 Init                 Init                  Init 
 GetX              Show               Show   
 GetY              Hide                Hide 
                        Shift                Shift 
                                               Explode 
                                               Circle  
                                               Init
Location
       Point              Square 
 Init                 Init                  Init 
 GetX              Show               Show   
 GetY              Hide                Hide 
                        Shift                Shift 
                                               Explode 
                                               Circle  
                                               Init 

 Show
                                               Hide 
                                               Shift 
                                               Explode
                                               Show
                                               Hide 
                                               Shift 
                                               Explode 
//point.h
class Location //«положение» – прародительский тип
{ protected:
int X;
int Y; //поля класса
public: //методы класса
void Init (int X1, int Y1); //инициализация «положения»
int GetX(); //возврат значения Х «положения»
int GetY(); //возврат значения Y «положения»
};
class Point : public Location //«точка» – производный тип, потомок Location
{ protected:
bool Visible; //«видимость точки» – дополнительное поле
//поля X и Y явно не записаны, но в классе есть
public: // методы класса
void Init (int X1, int Y1); //инициализировать «точку»
void Show(); //показать «точку»
void Hide(); //спрятать «точку»
void Shift (int X1, int Y1); //передвинуть «точку»
};
class Square: public Point //«квадрат» – производный тип, потомок Point
{ protected:
int Side; //«размер стороны квадрата» – новое поле}
//поля Visible, X и Yявно не записаны, но в типе есть
public: //дальше идут методы класса
void Init (int X1, int Y1, int Side1); //инициализировать «квадрат»
void Show(); //показать «квадрат»
void Hide(); //спрятать «квадрат»
void Shift (int X1, int Y1); //передвинуть «квадрат»
void Explode (int Step); //расширить «квадрат»
};
class Circle: public Point
{ protected:
int Radius; //«значение радиуса» – новое поле
//поля Visible, X и Yявно не записаны, но в классе есть
public: //дальше идут методы класса
void Init ( int X1, int Y1, int CRadius);
void Show(); //показать «окружность»
void Hide(); //спрятать «окружность»
void Shift (int X1, int Y1); //передвинуть «окружность»
void Explode (int Step); //расширить «окружность»
};
// stdafx.h
#pragma once
#define WIN32_LEAN_AND_MEAN / Exclude rarely-used stuff from Windows headers
#include <stdio.h>
#include <tchar.h>
#include <conio.h>
#include <iostream>
using namespace std;
#include "point.h"
// point.cpp
#include "stdafx.h"
void Location::Init (int X1, int Y1)
{
X=X1;
Y=Y1;
cout << endl << "polojenie tochki: " << X << " " << Y << endl;
}
int Location::GetX()
{
return X;
}
int Location::GetY()
{
return Y;
}
void Point::Init (int X1, int Y1)
{
Location::Init (X1, Y1);
}
void Point::Show()
{
Visible = true;
cout << " tochka " << X << " " << Y << endl; //рисует точку текущим цветом
}
void Point::Hide()
{
Visible = false;
cout << "tochki net"<< endl; //«прячет» точку, рисуя ее цветом фона
}
void Point::Shift (int X1, int Y1)
{
Hide(); //прячет «старую» точку, рисуя ее цветом фона
Init (X1, Y1); //устанавливает новые значения точки
Show(); //рисует новую точку текущим цветом
}
void Square::Init (int X1, int Y1, int Side1) //инициализация квадрата
{
Side = Side1; //инициализация стороны квадрата
Point::Init(X1, Y1); //инициализация положения квадрата
}
void Square::Show() //показать квадрат
{
Visible = true;
//рисование квадрата с центром в точке X, Y и стороной Side
cout << " cvadrat: " << X << " " << Y << " " << Side << endl;
}
void Square::Hide() //спрятать квадрат
{
cout << "cvadrata net" << endl;
}
void Square::Shift (int X1, int Y1)//перемещение квадрата в точку X1, Y1
{
Hide();
X=X1; //инициализация новых значений положения квадрата
Y =Y1;
Show(); //вызываем Square::Show, рисуем квадрат в новом месте
}
void Square::Explode (int Step)
{
Hide(); // вызываем Square::Hide, чтобы спрятать квадрат
Side += Step; //увеличение значения стороны квадрата
Show(); //вызываем Square::Show, чтобы показать новый квадрат
}
void Circle::Init (int XP1, int YP1, int CRadius)
{
Point::Init ( XP1, YP1 );
Radius=CRadius;
}
void Circle::Show() //показать окружность
{
Visible = true;
//рисование окружности с центром в точке X, Y и радиусом Radius
cout << " okrugnost: " << X << " " << Y << " " << Radius << endl;
}
void Circle::Hide() //спрятать окружность
{ cout << " okrujnosti net" <<endl;
}
void Circle::Shift (int X1, int Y1) //перемещение окружности в точку X1, Y1
{
Hide(); //вызываем Circle::Hide, стираем «старую» окружность
X=X1; //инициализация новых значений положения окружности
Y=Y1;
Show(); //вызываем Circle::Show, рисуем окружность в новом месте
}
void Circle::Explode (int Step)
{
Hide(); // вызываем Circle.Hide, чтобы спрятать окружность
Radius += Step; //увеличение значения радиуса
Show(); // вызываем Circle.Show, чтобы показать новую окружность
}
//main.cpp
#include "stdafx.h"
int main()
{Point XP;
XP.Init (100, 100);
XP.Show();
_getch();
XP.Shift(200, 200);
_getch();
XP.Hide();
_getch();
Square XS;
XS.Init (100, 100, 50);
XS.Show();
_getch();
XS.Shift(200, 200);
_getch();
XS.Explode(5); //увеличить сторону квадрата на 5
_getch();
XS.Explode(-5); //уменьшить сторону квадрата на 5
_getch();
Circle XC;
XC.Init (100, 100, 25);
XC.Show();
_getch();
XC.Shift(150, 150);
_getch();
XC.Explode(5); //увеличить радиус окружности на 5
_getch();
XC.Explode(-5); //уменьшить радиус окружности на 5
_getch();
XC.Hide();
_getch();
return 0;
}
| данные | P | S | C | 
| указатель | P.Init | S.Init | С.Init | 
| указатель | P.Show | S.Show | С.Show | 
| указатель | P.Hide | S.Hide | С.Hide | 
| указатель | P.Shift | S.Shift | С.Shift | 
| S.Explode | С.Explode | 
Point P;
Circle C;
Square S;
На основе данных классов можно создавать новых потомков. Создадим классы «закрашенный квадрат» и «закрашенная окружность».
 Location        Point              Square           PaintSquare
 Init                 Init                  Init                  Init
 GetX              Show               Show              Show
 GetY              Hide                Hide                Hide
                        Shift                Shift                Shift
                                               Explode          Explode
                                               Circle
            PaintCircle
                                                Init                  Init
Location        Point              Square           PaintSquare
 Init                 Init                  Init                  Init
 GetX              Show               Show              Show
 GetY              Hide                Hide                Hide
                        Shift                Shift                Shift
                                               Explode          Explode
                                               Circle
            PaintCircle
                                                Init                  Init
Show Show Hide Hide Shift Shift Explode Explode
//point_dop.h
class PaintSquare: public Square //закрашенный квадрат – потомок Square {protected:
int SquareColor; //цвет закраски квадрата – новое поле //поля Visible, X и Yявно не записаны, но есть в типе
public: void Init (int X1, int Y1, int Side1, int Color); void Show(); void Hide(); void Shift (int X1, int Y1); void Explode (int Step); };
class PaintCircle: public Circle //закрашенная окружность – потомок Circle {protected:
int CircleColor; //цвет закраски окружности – новое поле //поля Visible, X и Yявно не записаны, но есть в типе
public: void Init (int X1, int Y1, int Rad, int Color); void Show(); void Hide(); void Shift (int X1, int Y1); void Explode (int Step); };
// stdafx.h
#pragma once
#define WIN32_LEAN_AND_MEAN / Exclude rarely-used stuff from Windows headers
#include <stdio.h>
#include <tchar.h>
#include <conio.h>
#include <iostream>
using namespace std;
#include "point.h"
#include "point_dop.h"
//point_dop.cpp
#include "stdafx.h"
void PaintSquare::Init (int X1, int Y1, int Side1, int Color) { Square::Init (X1, Y1, Side1); //инициализация полей квадрата, кроме SquareColor SquareColor= Color; //инициализация поля SquareColor
cout << "zakrachen cvadrat " << X << " " << Y << " " << Side << endl; }
void PaintSquare::Show() //показать закрашенный квадрат { Square::Show(); //нарисовать незакрашенный квадрат cout << " zakrachen cvadrat: " << X << " " << Y << " " << Side << endl;
}
void PaintSquare::Hide() { cout << "ubiraem zakrasku" << endl;
Square::Hide(); //прячем сам квадрат }
void PaintSquare::Shift (int X1, int Y1) { Hide(); //вызов PaintSquare::Hide, прячем закрашенный квадрат Init (X1, Y1, Side, SquareColor); //инициализация полей новыми значениями Show(); //вызов PaintSquare::Show, рисуем новую фигуру }
void PaintSquare::Explode (int Step) { Hide(); //вызов PaintSquare.Hide, прячем закрашенный квадрат Side += Step; Init (X, Y, Side, SquareColor); Show(); //вызов PaintSquare.Show, рисуем новый квадрат }
void PaintCircle::Init (int X1, int Y1, int Rad, int Color) { Circle::Init (X1, Y1, Rad); //инициализация полей окружности, кроме
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.