Міністерство освіти та науки України
Кафедра АСУ
Лабораторна робота №4
з дисципліни ООП
“ Віртуальні функції та поліморфізм”
Мета: Ознайомитись з поняттям поліморфізму, його застосуванням та вивчити механізм його реалізації за допомогою віртуальних функцій.
Послідовність роботи:
Ознайомитись з правилами оголошення та використання віртуальних функцій.
Визначити, які віртуальні функції будуть викликані в результаті виконання наведеної програми.
Проаналізувати результат роботи наведеної програми.
Для заданого варіанту завдання написати програму з використанням віртуальних функцій та продемонструвати дію механізму пізнього зв’язування.
Оформити звіт про роботу за такою структурою:
назва роботи;
мета роботи;
послідовність роботи;
індивідуальне завдання;
текст програми;
контрольний приклад та результати роботи програми;
висновки.
Індивідуальне завдання: створити клас ТРІЙКА ЦІЛИХ ЧИСЕЛ. Визначити віртуальну фунцію обчислення різниці між трійками. Створити похідні класи ЧАС (з полями: година, хвилина і секунда), ДАТА (з полями: рік, місяць і день) зі своїми функціями обчислення різниці між моментами часу (датами). Для перевірки використати масив вказівників на об’єкти базового класу, яким присвоїти адреси об’єктів похідних класів.
Лістинг програми
#include <iostream>
#include <conio.h>
using namespace std;
class three{
public:
double t1;
double t2;
double t3;
public:
three(){ }
~three(){ }
void set_t1_t2_t3(double a, double b, double c){
t1=a;
t2=b;
t3=c;
}
double get_t1(){ return t1; }
double get_t2(){ return t2; }
double get_t3(){ return t3; }
virtual double riznucia(three *pr){
double rez;
rez=(t1+t2+t3)-(pr->t1)-(pr->t2)-(pr->t3);
return rez;
}
};
class clock:public three{
public:
virtual double riznucia(three *pr){
double rez1, rez2, rez;
rez1=t1*3600+t2*60+t3;
rez2=(pr->t1*3600)+(pr->t2*60)+pr->t3;
if(rez1<rez2) return -1;
else return rez=rez1-rez2;
}
};
class data:public three{
public:
virtual double riznucia(three *pr){
double rez,rez1,rez2;
rez1=(t1*365.3)+(t2*30.3)+t3;
rez2=(pr->t1*365.3)+(pr->t2*30.3)+pr->t3;
if(rez1<rez2) return -1;
else return rez=rez1-rez2;
}
};
int main(){
double x,y,z;
three *p[6];
p[0]=new three;
p[1]=new three;
cout<<"Enter dani 1 thriyku: ";
cin>>x>>y>>z;
p[0]->set_t1_t2_t3(x,y,z);
cout<<"Enter dani 2 thriyku: ";
cin>>x>>y>>z;
p[1]->set_t1_t2_t3(x,y,z);
cout<<"Riznucia: "<<p[0]->riznucia(p[1]);
delete p[0];
delete p[1];
cout<<"\n\n";
p[2]=new clock;
p[3]=new clock;
cout<<"Enter hours, minutes, seconds: ";
cin>>x>>y>>z;
p[2]->set_t1_t2_t3(x,y,z);
cout<<"Enter hours, minutes, seconds: ";
cin>>x>>y>>z;
p[3]->set_t1_t2_t3(x,y,z);
if(p[2]->riznucia(p[3])==-1) cout<<"Error clock1 < clock2: videmnuy result!"<<endl;
else cout<<"Riznucia: "<<p[2]->riznucia(p[3])<<" seconds";
delete p[2];
delete p[3];
cout<<"\n\n";
p[4]=new data;
p[5]=new data;
cout<<"Enter year, month, day: ";
cin>>x>>y>>z;
p[4]->set_t1_t2_t3(x,y,z);
cout<<"Enter year, month, day: ";
cin>>x>>y>>z;
p[5]->set_t1_t2_t3(x,y,z);
if(p[4]->riznucia(p[5])==-1) cout<<"Error data1 < data2: videmnuy result!"<<endl;
else cout<<"Riznucia: "<<p[4]->riznucia(p[5])<<" days";
delete p[4];
delete p[5];
getch();
return 0;
}
/Скріншот виконання програми
Висновок: виконуючи дану лабораторну роботу, я ознайомився з поняттям поліморфізму, його застосуванням та вивчив механізм його реалізації за допомогою віртуальних функцій.