ЛЕКЦИЯ 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
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
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).
Ссылка на скачивание - внизу страницы.