Лабораторные работы МИРЭА 2014 (1017113), страница 11
Текст из файла (страница 11)
int x;/* к этим данным имеют доступ только методы данного класса и производных*/
int y;
public:
int a;
int b;
int f1(int x,int y)/* метод класса*/
{
return (x-y);
}
};
class B:A //это объявляется класс, производный от А, при этом наследуются члены классы А
{
public:
int f2(int x)/* метод класса*/
{
/*Здесь могут использоваться члены-данные базового
класса из секции protected.
Так как имя аргумента метода f2() совпадает с именем
поля х из класса А, унаследованного классом В,
то чтобы различить, какая переменная к какому классу
относится, потребовалось уточнить с помощью
спецификатора ::.
Показано, что в теле метода х берется тот, что
унаследован от А, и собственный аргумент х самого
метода f2():*/
A::x=20;
return (x+A::x);
}
};
int main()
{
system("chcp 1251");
cout<<"Здравствуй, мир!";
A min; //создание экземпляров классов А,В
B max;
min.a=10; // Работа с элементами класса А из секции public
min.b=20;
int x1=min.f1(min.a,min.b);
int x2=max.f2(10);//Работа с элементами класса В
cout<<endl<<"x1="<<x1<<" X2="<<x2;
_getch();
//return 0;
}
Пример_2:
#include <iostream.h>
#include <conio.h>
class A
{
protected:
int x;
int y;
public:
int a;
int b;
int f1(int x,int y)
{
return (x-y);
}
};
class B:A
{
public:
int f2(int x)
{
A::x=20;
return (x+A::x);
}
};
int main()
{
system("chcp 1251");
cout<<"Здравствуй, мир!";
A *min=(A *) new A();
B *max=(B *) new B();
min->a=10;
min->b=20;
int x1=min->f1(min->a,min->b);
int x2=max->f2(10);
cout<<endl<<"x1="<<x1<<" X2="<<x2;
_getch();
delete min;
delete max;
}
Пример_3:
/*Новый класс должен будет задавать дополнительную характеристику изделия - его форму*/
#include <iostream.h> //for printf()
#include <conio.h> // for _getch()
//детали изделия в качестве объектов (экземпляров класса)
class produce //начало определения класса
{
private:
int modelnumber; // номер изделия
int partnumber; // номер детали
float cost; // стоимость детали
public:
// установка данных
// функция-член класса
// присваивает данным класса значения своих параметров
void setpart(int mn, int pn, float c)
{
modelnumber=mn;
partnumber=pn;
cost=c;
}
void show() // вывод данных
{
system("chcp 1251");
cout<< endl<<"Номер модели: " << modelnumber;
cout<< endl<<"Номер детали: " << partnumber;
cout<< endl<<"Цена единицы: " << cost;
}
};//конец описания класса
//Объявление класса-наследника с новыми членами:
class MoreProduce:public produce
{
public:
char *ProduceForm; //описание формы изделия
void FormDecl(char *s)
{
ProduceForm=s;
}
void show1()
{
cout<< endl << "Форма изделия: " << ProduceForm;
}
};
// обработка класса в головной программе
int main()
{
MoreProduce newizd;
newizd.setpart(100,200,250.5);
newizd.FormDecl("Square");
newizd.show();
newizd.show1();
_getch();
}
Задания для самостоятельной работы
При выполнении задания к данной лабораторной работе необходимо написать программу, демонстрирующую работу наследования согласно варианту задания.
Варианты лабораторных заданий.
Вариант 1
Создать базовый класс Car (машина), характеризуемый торговой маркой (строка), числом цилиндров, мощностью. Определить методы переназначения и изменения мощности. Создать производный класс Lorry (грузовик), характеризуемый также грузоподъемностью кузова. Определить функции переназначения марки и изменения грузоподъемности.
Вариант 2
Создать класс Pair (пара чисел); определить методы изменения полей и сравнения пар: пара p1 больше пары р2, если (first.pl > first.р2) или (first.pl > first.р2) и (second.pl > second.р2). Определить класс−наследник Fraction с полями: целая часть числа и дробная часть числа. Определить полный набор методов сравнения.
Вариант 3
Создать класс Liquid (жидкость), имеющий поля названия и плотности. Определить методы переназначения и изменения плотности. Создать производный класс Alcohol (спирт), имеющий крепость. Определить методы переназначения и изменения крепости.
Вариант 4
Создать класс Pair (пара чисел); определить методы изменения полей и вычисления произведения чисел. Определить производный класс Rectangle (прямоугольник) с полями−сторонами. Определить методы вычисления периметра и площади прямоугольника.
Вариант 5
Создать класс Man (человек), с полями: имя, возраст, пол и вес. Определить методы переназначения имени, изменения возраста и изменения веса. Создать производный класс Student, имеющий поле года обучения. Определить методы переназначения и увеличения года обучения.
Вариант 6
Создать класс Triad (тройка чисел); определить методы изменения полей и вычисления суммы чисел. Определить производный класс Triangle с полями−сторонами. Определить методы вычисления углов и площади треугольника.
Вариант 7
Создать класс Triangle с полями−сторонами. Определить методы изменения сторон, вычисления углов, вычисления периметра. Создать производный класс Equilateral (равносторонний), имеющий поле площади. Определить метод вычисления площади.
Вариант 8
Создать класс Triangle с полями−сторонами. Определить методы изменения сторон, вычисления углов, вычисления периметра. Создать производный класс RightAngled (прямоугольный), имеющий поле площади. Определить метод вычисления площади.
Вариант 9
Создать класс Pair (пара чисел); определить методы изменения полей и вычисления произведения чисел. Определить производный класс RightAngled с полями−катетами. Определить методы вычисления гипотенузы и площади треугольника.
Вариант 10
Создать класс Triad (тройка чисел); определить метод сравнения триад. Определить производный класс Date с полями: год, месяц и день. Определить полный набор методов сравнения дат.
Вариант 11
Создать класс Triad (тройка чисел); определить метод сравнения триад. Определить производный класс Time с полями: час, минута и секунда. Определить полный набор методов сравнения моментов времени.
Вариант 12
Реализовать класс−оболочку Number для числового типа float. Реализовать методы сложения и деления. Создать производный класс Real, в котором реализовать метод возведения в произвольную степень, и метод для вычисления логарифма числа.
Вариант 13
Создать класс Triad (тройка чисел); определить методы увеличения полей на 1. Определить производный класс Date с полями: год, месяц и день. Переопределить методы увеличения полей на 1 и определить метод увеличения даты на п дней.
Вариант 14
Реализовать класс−оболочку Number для числового типа double. Реализовать методы умножения и вычитания. Создать производный класс Real, в котором реализовать метод, вычисляющий корень произвольной степени, и метод для вычисления числа π в данной степени.
Вариант 15
Создать класс Triad (тройка чисел); определить методы увеличения полей на 1. Определить класс−наследник Time с данными−член: час, минута, секунда. Переопределить методы увеличения полей на 1 и определить методы увеличения на п секунд и минут.
Вариант 16
Создать базовый класс Pair (пара целых чисел) с операциями проверки на равенство и перемножения полей. Реализовать операцию вычитания пар по формуле (а, b) − (с, d) = (а − b, с − d). Создать производный класс Rational; определить новые операции сложения (a, b) + (c,d) = (ad + bd, bd) и деления (a,b) / (с,d) = (a/d, b/d); переопределить операцию вычитания (а,b) − (c,d) = (a − b,c − d).
Вариант 17
Создать класс Pair (пара чисел); определить метод перемножения полей и операцию сложения пар (а, b) + (с, d) = (а + b, с + d). Определить производный класс Complex с полями: действительная и мнимая части числа. Определить методы умножения (a, b) ×(c,d) = (ас × bd, ad × be) и вычитания (а,b) − (c,d) = (a − b,c − d).
Вариант 18
Создать класс Pair (пара целых чисел); определить методы изменения полей и операцию сложения пар (а, b) + (с, d) = (а + b, с + d). Определить класс−наследник Long с полями: старшая часть числа и младшая часть числа. Переопределить операцию сложения и определить методы умножения и вычитания.
Вариант 19
Создать базовый класс Triad (тройка чисел) с операциями сложения с числом, умножения на число, проверки на равенство. Создать производный класс vector3D, задаваемый тройкой координат. Должны быть реализованы: операция сложения векторов, скалярное произведение векторов.
Вариант 20
Создать класс Pair (пара целых чисел); определить метод умножения на число и операцию сложения пар (а, b) + (с, d) = (а + b, с + d). Определить класс−наследник Money с полями: рубли и копейки. Переопределить операцию сложения и определить методы вычитания и деления денежных сумм.
Контрольные вопросы:
-
Дайте определение понятию виртуальная функция?
-
Что такое чистая виртуальная функция? Если в объявлении класса имеется чистая виртуальная функция, как называется такой класс и какие ограничения налагаются на его использование?
-
Как создать виртуальный конструктор−копировщик?
-
Как вызвать функцию базового класса из объекта производного класса, если в производном классе эта функция была замешена?
-
Как вызвать функцию базового класса из объекта производного класса, если в производном классе эта функция не была замешена?
-
Если в базовом классе функция объявлена как виртуальная, а в производном классе виртуальность функции указана не была, сохранится ли функция как виртуальная в следующем произведенном классе?
-
С какой целью используется ключевое слово protected?
-
Динамический полиморфизм достигается посредством использования _ функций и указателей _ класса. (Вставьте пропущенные слова.)
-
Если при наличии иерархии классов в производном классе опушена перегрузка (не чистой) виртуальной функции, что происходит, когда объект этого производного класса вызывает такую функцию?
-
Что производный класс наследует из базового класса?
-
Что производный класс не наследует из базового класса?
-
В каком порядке вызываются конструкторы и деструкторы класса при создании и удалении объекта производного класса?
-
Требуются ли конструкторы производному классу, если он не добавляет к базовому классу элементы данных?
-
Почему лучше передавать объект по ссылке, а не по значению?
Лабораторная работа №7
ПОТОКИ И ИСКЛЮЧЕНИЯ
Цель работы: получить практические навыки решения задач с использованием текстовых файлов на языке С++..