Полиморфизм. Виртуальные функции. Позднее связывание. Пример шаблона семейства функций. Класс в качестве перегружаемого параметра функции

Страницы работы

Фрагмент текста работы

ЛЕКЦИЯ  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);  //инициализация полей окружности, кроме

Похожие материалы

Информация о работе

Тип:
Конспекты лекций
Размер файла:
450 Kb
Скачали:
0