- •3.5 Методические указания к выполнению практических и лабораторных работ Практическая работа Запись простейших алгоритмов обработки числовых данных
- •Форма представления результатов практической работы: отчет на бумажном носителе с блок-схемами решения задач.
- •Лабораторная работа № 1
- •Исследование визуальной среды программирования
- •Microsoft Visual Basic 6.0 для операционной системы Windows
- •Лабораторная работа № 2 Технология алгоритмического программирования
- •Лабораторная работа № 3 Технология структурного программирования
- •Лабораторная работа № 4 Технология визуального программирования
- •Лабораторная работа № 5 Технология объектно-ориентированного программирования
- •Этап 5.2. Исследование механизма работы с подпрограммами
- •Этап 5.3. Исследование сложных типов данных
- •Этап 5.4. Исследование операторов работы с файлом
- •Этап 5.5. Исследование операций с объектами и классами
- •Основы программирования на языке Turbo Pascal
Этап 5.5. Исследование операций с объектами и классами
Переписать из листинга № 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();
}
Переписать из листинга № 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) |
Получение максимального значения величины |
Параметр или идентификатор
|
|
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 с различными типами параметров.
Шаблоны классов позволяют строить классы аналогично шаблонам функций.