Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК_ПрОА_Лабораторные работы.doc
Скачиваний:
22
Добавлен:
03.05.2015
Размер:
606.72 Кб
Скачать

Этап 5.5. Исследование операций с объектами и классами

  1. Переписать из листинга № 16 программу, иллюстрирующую создание и инициализацию объектов класса, исследовать ее работу, объяснить результат. Придумать пример по аналогии.

Листинг 16. Создать объекты класса, присвоить начальные значения их свойствам. Обеспечить к ним доступ извне.

#include<iostream.h>

#include<string.h>

class date

{

public: char name[64];

int day;

char month[9];

int year;

void show_birthday(void)

{

соut<<"Имя: "<<name<<endl;

соut<<"День рождения :"<<day<<" "<<month<<" "<<year<<endl;

};

};

void main(void)

{

date father,mother,daughte; //объявление объектов

strcpy(father.name,"Юрий");

father.day=25;

strcpy(father.month,"ноября");

father.year=1958;

strcpy(mother.name,"Лидия");

mother.day=14;

strcpy(mother.month,"ноября");

mother.year=1956;

strcpy(daughte.name,"Юлия");

daughte.day=4;

strcpy(daughte.month,"мая");

daughte.year=l982;

father.show_birthday(); //вывод информации

mother.show_birthday();

daughte.show birthday();

}

  1. Переписать из листинга № 17 программу, иллюстрирующую концепцию инкапсуляции данных как сокрытие части свойств путем объявления элементов класса частными (private), исследовать ее работу, объяснить результат. Придумать пример по аналогии.

Листинг 17. Пример инкапсуляции

#include<iostream.h>

#include<string.h>

class zp

{

private: //объявление частных элементов

char name[64];

float sal;

public: //объявление общих элементов

void in_dat(char *,float); //прототипы функций

void show_sal(void);

float change_sal(float);

void zp::in_dat(char *new_name,float old_sal) //определение функции

{

strcpy(name,new name);

sal=old_sal;

}

void zp::show_sal(void) //определение функции

{

cout<<"Оклад "<<name<<": "<<sal<<" рублей, "<<endl;

}

float zp::change_sal(float new_sal) //определение функции

{

if(new_sal<10000)

{

cout<<"Новый оклад "<<name<<" недопустимо мал! "<<endl;

return (0);

}

sal=new_sal;

return(1);

}

void main(void)

{

float new_sal;

zp father; //объявление объекта father

father.in_dat("Иванов И.А.",20000.0) ;

cout<<"Старый ";

fatner.show_sal() ;

сout<<"Введите новый оклад:";

cin>>new_sal;

if(father.change_sal(new_sal)!=0)

{

Сout<<"Новый ";

father.show sal();

}

}

Главной программе (main) известны лишь методы (in_dat, show_sal, change_sal), позволяющие работать с объектом (father). Свойства (name, sal) и способы их обра­ботки скрыты от главной программы внутри объектов.

Результат выполнения лабораторной работы: Вы ознакомились с основами технологии объектно-ориентированного программирования и языка С++: типовыми действиями с простыми и сложными типами данных, операторами ввода-вывода. Вы получили представление об особенностях особого типа данных – класс как совокупность свойств и методов (функций), научились описывать объекты данного класса, инициализировать их свойства и использовать методы объектов для обеспечения доступа к свойствам объектов.

Форма представления результатов лабораторной работы: папка с файлами.

Основы программирования на языке Turbo Pascal

Структура программы представлена на рис. 3.8.

Рис. 3.8 Структура программы на языке TurboPascal

Классификация данных представлена на рис. 3.9

Рис. 3.9 Классификация типов данных в языке Turbo Pascal

Таблица 3.20 Тип данных целые числа

Тип

Диапазон

Формат

Размер в байтах

Shortint

-128 … 127

Знаковый

1

Integer

-32768 ... 32767

Знаковый

2

Longint

-2147483648 … 2147483647

Знаковый

4

Byte

0 … 255

Беззнаковый

1

Word

0… 65535

Беззнаковый

2

Синтаксис описания целых переменных

VAR

X: integer;

i: byte;

Таблица 3.21 Тип данных вещественные числа

Тип

Диапазон

Число значащих цифр

Размер в байтах

Real

2.9*10-39 … 1.7*1038

11-12

6

Single

1.5*10-45 … 3.4*1038

7-8

4

Double

5.0*10-324 … 1.7*10308

15-16

8

Extended

3.4*10-4932 … 1.1*104932

19-20

10

Comp

-263+1…263-1

19-20

8

Синтаксис описания вещественных переменных

VAR

X: real;

Y: single;

Таблица 3.22 Простые типы данных

Тип

Наименование

Размер в байтах

Значения

Синтаксис описания

Логический

Boolean

1

True, False

VAR

flag: Boolean;

Символьный

Char

1

ASCII - символы

VAR

letter: Char;

Перечисляемый

<имя типа>

-

Набор идентификаторов

TYPE

Season = («Зима», «Весна», «Лето», «Осень»);

Диапазон

<имя типа>

-

Min…Max

TYPE

Temperature = (36..39);

Таблица 3.23 Структурированные типы данных

Тип

Наимено-вание

Назначение

Синтаксис описания

Массив

Array

Содержит фиксированное количество упорядоченных однотипных элементов, снабженных индексами. Бывает одномерным и многомерным.

TYPE

Matrix = array[1..3, 1..2] of Shortint;

Строка

String

Является разновидностью массива символов. Содержит произвольный текст.

VAR

Document: string[1200];

January: string[10] = ‘Январь’;

Запись

Record

Включает набор полей разного типа.

TYPE

Data = record {тип – дата рождения}

Year: Integer;

Month: 1 .. 12;

Day: 1 .. 31;

end;

Множество

Set

Множество возможных сочетаний объектов исходного множества.

TYPE

Alfa = set of ‘A’ .. ‘Z’;

Count = set of (Plus, Minus, Mult, Divid);

Ten = set of 0 .. 9;

Number = set of ‘0’ .. ‘9’;

Файл

File

Последовательность элементов одного типа, расположенных на внешнем устройстве. Число элементов в файле не объявляется.

TYPE

Number = file of Integer;

Symbol = file of ‘A’ .. ‘Z’;

Таблица 3.24 Процедурные типы данных

Тип

Наимено-вание

Назначение

Синтаксис описания

Процедура

Procedure

Предназначена для выполнения законченной последовательности действий.

Procedure <имя процедуры> (<список формальных параметров>);

PROCEDURE Name_1 (VAR Symbol: Char; K: Integer);

Функция

Function

Предназначена для вычисления параметра.

FUNCTION Factorial(N: Byte): Longint;

X:=Factorial(5); {вызов функции}

Конструирование выражений

Выражение – это синтаксическая единица языка, определяющая способ вычисления некоторого значения. Выражения формируются из:

  • констант,

  • переменных,

  • функций,

  • знаков операций,

  • круглых скобок.

Константы

Константами называются параметры программы, значения которых не меняются в процессе ее выполнения.

CONST

<имя константы 1> = <значение 1>;

<имя константы 2> = <значение 2>;

<имя константы N> = <значение N>;

Переменные

Переменными называются параметры программы, значения которых могут изменяться в процессе ее выполнения. Все переменные должны быть определены с указанием их типов:

  • в разделе объявления переменных программы,

  • в разделе объявления переменных подпрограммы,

  • в разделе объявления переменных модуля,

  • в заголовке подпрограммы.

VAR

<список переменных 1>: <тип 1>;

<список переменных 2>: <тип 2>;

<список переменных N>: <тип N>;

Стандартные функции

Таблица 3.25 Стандартные арифметические функции

Функция

Назначение

Тип результата

Abs (X)

Абсолютное значение аргумента

Совпадает с типом X

Arctan (X)

Арктангенс аргумента

Вещественный

Cos (X)

Косинус аргумента

Вещественный

Exp (X)

Е в степени х

Вещественный

Frac (X)

Дробная часть числа

Вещественный

Int (X)

Целая часть числа

Вещественный

Ln (X)

Натуральный логарифм

Вещественный

Pi

Значение величины

Pi=3.1415926535897932385

Вещественный

Sin (X)

Синус аргумента

Вещественный

Sqr (X)

Квадрат аргумента

Совпадает с типом X

Sqrt (X)

Квадратный корень аргумента

Вещественный

Таблица 3.26 Функции преобразования типов

Функция

Назначение

Аргумент

Тип результата

Chr (X)

Преобразование ASCII-кода в символ

Целый тип в диапазоне (0..255)

Символ, соответствующий коду

High (X)

Получение максимального значения величины

Параметр или идентификатор

  1. порядкового типа,

  2. типа-массива,

  3. типа-строки,

  4. открытый массив

  1. Макс. значение величины

  2. Макс. значение индекса

  3. Объявленный размер строки

  4. Кол-во элементов массива минус 1

Low (X)

Получение минимального значения величины

Ord (X)

Получение индекса любого порядкового типа

Round (X)

Округление вещественного числа до ближайшего целого

Trunc (X)

Получение целой части вещественного числа

Таблица 3.27 Функции для величин порядкового типа

Функция

Назначение

Аргумент

Тип результата

Odd (X)

Проверка величины X на нечетность

Pred (X)

Определение предыдущего значения X

Succ (X)

Определение последующего значения X

Операции

  • арифметические;

  • логические;

  • операции с битами информации;

  • операции со строками;

  • операции отношения;

  • адресная операция @.

Арифметические операции (применимы только к величинам целых и вещественных типов).

Таблица 3.28 Арифметические операции

Знак

Операция

Типы операндов

Тип результата

+

Сложение

Целые

Хотя бы один вещественный

Целый

Вещественный

-

Вычитание

Целые

Хотя бы один вещественный

Целый

Вещественный

*

Умножение

Целые

Хотя бы один вещественный

Целый

Вещественный

/

Деление

Целые или вещественные

Вещественный

Div

Деление целых чисел

Целые

Целый

Mod

Остаток от деления целых чисел

Целые

Целый

Таблица 3.29 Операции отношений

Знак

Операция отношения

=

Равно

<>

Не равно

<

Меньше

<=

Меньше или равно

>=

Больше или равно

>

Больше

Операторы управления последовательностью программы

Операторы языка описывают алгоритмические действия, которые необходимо выполнить для решения задачи. Тело программы – последовательность операторов, разделенных точкой с запятой. Классификация операторов представлена на рис. 3.10

Рис. 3.10 Операторы управления последовательностью выполнения программы

Таблица 3.30 Структурированные операторы

Оператор

Наимено-вание

Назначение

Синтаксис описания

Составной

BEGIN-END

Объединяет последовательность операторов в логический блок (логические скобки)

BEGIN

<оператор 1>;

<оператор 2>;

<оператор N>

END;

Условный

IF

Реализует алгоритмическую конструкцию РАЗВИЛКА и изменяет порядок выполнения операторов в зависимости от истинности или ложности некоторого условия

IF s THEN a

ELSE b; {полная развилка}

IF s THEN a; {укороченная развилка}

Условный

CASE

Реализует выбор варианта из любого количества вариантов

CASE s OF

C1: Instruction 1;

C2: Instruction 2;

CN: Instruction N;

ELSE Instruction

END;

Оператор цикла

REPEAT

Выполнение цикла, состоящего из любого числа операторов, с неизвестным заранее числом повторений. Тело цикла выполняется хотя бы один раз. Выход – при истинности логического выражения

REPEAT

Instruction 1;

Instruction 2;

Instruction N

UNTIL s;

Оператор цикла

WHILE

Организует выполнение одного оператора неизвестное заранее число раз.

Выход – ложность логического выражения, которое проверяется в начале каждой итерации. Тело цикла может не выполняться ни разу.

WHILE s DO

Instruction;

Оператор цикла

FOR

Организует выполнение одного оператора заранее известное число раз.

FOR Param:=Start TO Finish DO Instruction;{если Start<Finish}

FOR Param:=Start DOWNTO Finish DO Instruction; {если Start>Finish}

Таблица 3.31 Операторы ввода-вывода

Оператор

Наимено-вание

Назначение

Синтаксис описания

Ввод с клавиатуры

READ

Ввод числа с клавиатуры и сохранение его в x

Var x: Integer;

Read(x);

Вывод на экран

WRITE

Вывод содержимого переменной x на экран

Var x: Integer;

x:= 25;

Write (‘Значение переменной x=’, x)

Ввод (чтение) данных из файла в память

READ

Из файла “File.txt” вводятся три первые числа и запоминаются в переменных a, b, c

Var f:Text;

a, b, c: integer;

ASSIGN (f, “file.txt”);

RESET(f);

READ (f, a, b, c);

CLOSE (f);

Вывод (добавление) данных из памяти в файл

WRITE

В существующий файл “File.txt” добавляется “текст”

Var f:Text;

a, b, c: integer;

Assign (f, “File.txt”);

Append(f);

WriteLn (f, “текст”);

CLOSE (f);

Вывод (перезапись) данных из памяти в файл

WRITE

Создается файл “File.txt” и в него записывается “текст”. Если файл существовал, его содержимое заменяется на “текст”

Var f:Text;

a, b, c: integer;

Assign (f, “File.txt”);

Rewrite (f);

WriteLn (f, “текст”);

CLOSE (f);

Основы программирования на языке С++

Структура программы на языке С++ представлена на рис. 3.22

Рис. 3.22 Структура программы на языке С++

Классификация данных языка С++

Таблица 3.34 Базовые типы данных

Тип

Диапазон

Формат

Размер в байтах

Числовые типы данных

void

Пустой

unsigned

0…65535

Беззнаковый

2

int

-32768 ... 32767

Знаковый

2

long

-2147483648 … 2147483647

Знаковый длинный

4

float

-3,4E-38…3,4E+38

Знаковый с плавающей точкой

4

double

-1,7E-308…1,7E+308

Знаковый с плавающей точкой двойной длины

8

Синтаксис описания числовых переменных

int i;

float x,y,z;

Символьный тип данных

char

-128…127

Коды символов

1

Синтаксис описания символьных переменных

char c; //символ

char s[64]; // строка символов

Классификация данных в языке С++ представлена на рис. 3.23

Рис. 3.23 Классификация типов данных в языке С++

Таблица 3.35 Структурированные типы данных

Тип

Наимено-вание

Назначение

Синтаксис описания

Массив

Содержит фиксированное количество упорядоченных однотипных элементов, снабженных индексами. Бывает одномерным и многомерным.

int a[100] /*одномерный массив

/*целых чисел

float d[40][5] /*двумерный массив

/*вещественных чисел

Структу-ра

struct

Содержит фиксированное число элементов разного типа

struct имя_структуры

{

тип1 имя_элемента1;

...

TипN имя_элементаN;

}имя_переменной_типа_структуры;

ПРИМЕР

struct date

{

int day;

char month[9];

int year;

}d;

Объединение

union

Подобно структуре, но в каждый момент времени хранит значение только одного элемента

union имя_объединения

{

тип1 имя_элемента1;

...

TипN имя_элементаN;

}имя_переменной_типа_объединения;

ПРИМЕР

union time

{

int hour;

long second;

}t;

Файл

out_file

in_file

Последовательность элементов одного типа, расположенных на внешнем устройстве. Число элементов в файле не объявляется.

#include<fstream.h>

ofstream out_file ("имя_файла.расширение"); //открытие файла в режиме создания и вывода данных в него

ifstream in_file ("имя_файла.расширение");

//открытие файла в режиме ввода данных из него

Класс

class

Структура, содержащая описание данных и функций

class имя_класса

{

тип1 имя_элемента1;

типN имя_элементаN;

описание_функции1;

описание_функцииN;

}

ПРИМЕР

class date

{

public: char name[64];

int day;

char month[9];

int year;

void show_birthday(void); //прототип функции

};

Таблица 3.36 Процедурные типы данных

Тип

Наимено-вание

Назначение

Синтаксис описания

Функция

Предназначена для выполнения действий и /или вычисления параметра.

void main(void) /*начало главной

/*функции

float name (float x, float y) /*описание функции с параметрами

Операторы языка С++ представлены на рис. 3.24

Рис. 3.24 Операторы управления последовательностью выполнения программы

Таблица 3.37 Арифметические операции

Знак

Операция

Знак

Операция

+

Сложение

.

Оператор выбора элемента

-

Вычитание

::

Разрешение области видимости

*

Умножение

++

Приращение

/

Деление

--

Уменьшение

=

Присваивание

*

Указатель на элемент

Таблица 3.38 Операции отношения

Знак

Операция отношения

= =

Равно

!=

Не равно

>=

Больше или равно

<

Меньше

<=

Меньше или равно

||

Логическое ИЛИ

&&

Логическое И

?:

Условный оператор сравнения.

Таблица 3.39 Простые операторы

Оператор

Наимено-вание

Назначение

Синтаксис описания

Присваивания

Записывает значение вычисленного выражения в именованную ячейку памяти

имя_переменной=выражение;

ПРИМЕР

F=3*c+2*sin(x);

Переход

goto

Программа переходит на выполнение операторов, следующих за помеченным меткой

goto метка;

ПРИМЕР

include <iostream.h>

void main(void)

{

float a,b;

b=5;

goto ml;

...

ml: a=b*3;

...

}

Ввод данных из входного потока в память

сin>>

Операция извлекает данные из входного потока, присваивая значение указанным переменным

#include <iostream.h>

cin>>xl>>...>>xN;

Вывод данных из памяти в выходной поток

cout<<

Операция вставляет данные в выходной поток

#include <iostream.h>

cout<<xl<<...<<xN;

Таблица 3.40 Специальные символы, используемые с оператором cout

Символ

Назначение

Звуковой сигнал динамика

\b

Символ возврата

\f

Символ перевода страницы

\n

Символ новой строки

\r

Возврат каретки

\t

Символ горизонтальной табуляции

\v

Символ вертикальной табуляции

\\

Символ обратный слеш

\?

Знак вопроса

\'

Одинарные кавычки

\"

Двойные кавычки

\0

Нулевой символ

Таблица 3.41 Структурированные операторы

Оператор

Наимено-вание

Назначение

Синтаксис описания

Условный

if

Реализует алгоритмическую конструкцию РАЗВИЛКА и изменяет порядок выполнения операторов в зависимости от истинности или ложности некоторого условия

if (условие) оператор1; else оператор2;

ПРИМЕР

#include <iostream.h>

void main(void)

{

float a,b,rl,r2;

cin>>a>>b;

cout<<"a="<<a<<" b="<<b<<endl ;

if (a>b) {rl=a;r2=b;} else {rl=b;r2=a}

cout<<"большее число="<<r1<<"меньшее число="<<r2;

}

Вариант

switch

Реализует выбор варианта из любого количества вариантов

switch (выражение)

{

case i:оператор1; break;

case j:oпepaтop2; breaks-

case k:oпepaтopK; break;

default:oпepaтopN; break;

}

Оператор цикл-ПОКА

while

Организует выполнение одного оператора неизвестное заранее число раз.

Выход – ложность логического выражения, которое проверяется в начале каждой итерации. Тело цикла может не выполняться ни разу.

while(условие)

оператор;

Оператор цикл-ДО

do while

Выполнение цикла, состоящего из любого числа операторов, с неизвестным заранее числом повторений. Тело цикла выполняется хотя бы один раз. Выход – при истинности логического выражения

do {операторы;}

while(условие);

Оператор цикла c парамет-ром

for

Организует выполнение одного оператора (простого или составного) заранее известное число раз.

for (i=iн;i<=iк; i=i+Δi) оператор;

Объектно-ориентированная терминология языка С++

Понятие класса

Класс (class) – это структура, содержащая описания данных функций. Функции класса называют методами класса.

class имя_класса

{

тип1 имя_элемента1;

типN имя_элементаN;

описание_функции1;

описание_функцииN;

}

Объект является представителем класса и объявляется после определения класса следующим образом:

имя_класса имя_объекта1,..., имя_объектаN;

Пример:

class date

{

public: char name[64];

int day;

char month[9];

int year;

void show_birthday(void) //прототип функции

};

void main(void)

{

date father, mother, daughter; //объявление объектов класса date

...

}

Понятие инкапсуляции

Инкапсуляция – это сокрытие некоторых данных, входящих в класс, путем объявления их частными (private). В отличие от общих (public) элементов класса, к которым можно обратиться из любого места программы, используя оператор-точку, к частным элементам можно обратиться только через функции (методы) класса.

Пример.Работа с классом

class zp // описание класса

{

private: //объявление частных элементов

char name[64];

float sal;

public: //объявление общих элементов

void in_dat(char *,float); //прототипы функций

void show_sal(void) ;

float change_sal(float);

}

void zp::in_dat(char *new_name,float old_sal) //описание функций

{

}

zp father; //объявление объекта father класса zp

Конструкторы и деструкторы объектов класса

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

Деструктор – это специальная функция без параметров, обеспечивающая уничтожение объекта в процессе выполнения программы. Деструктор носит имя класса, начинающееся с символа тильда (~), и описывается в программе как обычная функция (метод) класса. Применение деструкторов целесообразно при создании динамических списков, которые увеличиваются или уменьшаются в процессе выполнения программы.

Пример.

class zp

{

private:

char name[64] ;

float sal;

public:

zp(char *,float); //конструктор

~zp(void); //деструктор

void show sal(void);

};

zp::zp(char *new_name,float old_sal) //описание конструктора

{

...;

}

zp::~zp(void); //описание деструктора

{

...

}

void main(void)

{

zp father("Иванов H.M.",2000) ; //инициализация объекта father

...

}

Перегрузка операторов

Перегрузка операторов заключается в изменении смысла действия операторов при работе их с определенными классами. Например, в некотором классе можно описать функцию сложения двух символьных строк, которую компилятор C++ будет вызывать из этого класса для выполнения соответствующей операции. Если в программе используются, кроме того, операции сложения переменных типа int или float, то над ними будет выполнена стандартная операция сложения. Другими словами, смысл оператора сложения изменится только для элементов указанного класса.

Для перегрузки операторов в прототипе и в заголовке функции (метода) класса используется ключевое слово operator, после которого указывается символ перегружаемого оператора.

Пример.

class sum

{

private:

char word[256] ;

public:

sum(char *); //конструктор

void operator +(char *); //перегружаемый оператор (+)

void show_sum(void);

};

sum::sum(char *line) //описание конструктора

{

...

}

void sum::operator +(char *line) /*описание перегружаемого

{ /*оператора

...

}

void main(void)

{

sum statement("C++") ; //инициализация объекта statement

statement + " - удобный язык!";

}

Наследование и полиморфизм

Наследование – это возможность использования элементов класса, созданного для одной программы, в другой программе. Исходный класс называется базовым (родительским), построенный из ранее созданного класса называется производным.

Под простым наследованием понимается процесс создания одного производного класса, наследующего элементы базового класса.

Для создания производного класса нужно указать ключевое слово class, имя производного класса, двоеточие, режим доступа к элементам базового класса и имя базового класса. После этого надо определить элементы нового, производного класса.

Пример. Простое наследование

class zp //описание базового класса

{

private:

char name[64];

float sal;

public:

zp(char *,float);

void show_sal(void) ;

};

class zpp:public zp //описание производного класса

{

private: //определение элементов

float prize;

public:

zpp(char *,float,float);

void show_sal(void);

};

Множественное наследование

Под множественным наследованием понимается процесс создания производного класса из нескольких ранее созданных базовых классов.

class date //описание базового класса date

{

private:

char name[64];

char dat_birth[64];

public:

date(char *,char *);

void show_birth(void);

};

class zp //описание базового класса zp

{

private:

float sal;

public:

zp(float);

void show_sal (void);

};

При определении производного класса нужно указать ключевое слово class, имя производного класса, двоеточие, перечислить через запятую режимы доступа и имена базовых классов, а затем объявить элементы производного класса:

class date_sal:public date,puplic zp // описание производного

{ класса

private: /*описание элементов

float prize; /* производного класса

public:

date_sal(char *,char *,float,float);

void show_date_sal(void) ;

};

Понятие о полиморфизме и виртуальных функциях

Полиморфизм – это способность объекта изменять форму (поли – много, морфизм – изменение формы), возможность использовать одинаковые имена для методов, входящих в различные классы. Перегрузка функций и перегрузка операторов – это проявление полиморфизма во время компиляции программы на языке C++.

Полиморфизм во время выполнения программы обеспечивается использованием виртуальных функций базовых классов и применением указателей на объекты базовых классов. Для создания полиморфного объекта первоначально определяются виртуальные функции базовых классов при помощи ключевого слова virtual, размещаемого перед прототипами функций. В зависимости от того, на объект какого класса будет указывать указатель, определяется, какая виртуальная функция будет вызвана во время выполнения программы.

Создание указателя на объект базового класса выполняется в программе следующим образом:

Имя_базового_класса *указатель;

Для того чтобы изменить форму объекта, указателю присваивается адрес объекта производного класса:

указатель=(имя_базового_класса *)&имя_объекта_производного_класса;

Кроме перечисленных выше, в языке C++ существует еще один способ реализации полиморфизма – использование шаблонов функций и шаблонов классов.

Шаблон функции позволяет определить функции, возвращающие значения разных типов. Например, шаблон функции sqr, возвращающей значение переменной х, возведенное в квадрат, выглядит так:

template<class Т>Т sqr(Т х)

{

return(х*х);

} ;

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

Шаблоны классов позволяют строить классы аналогично шаблонам функций.

180