Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Звіт:
«Лабораторна робота № 8
Поліморфізми»
Підготував:
Ст.гр. КІ-12
Андрощук С.В.
Перевірив:
Цигилик Л.О.
Львів 2008
Мета роботи:
Короткі теоретичні відомості
Поліморфізм
Поліморфізм – це концепція в програмуванні, відповідно до якої використовується спільний інтерфейс для обробки даних різних спеціалізованих типів. Іншими словами один і той же метод може бути визначений для об’єктів різних типів. Конкретна поведінка метода буде залежати від типу об’єкта. С++ підтримує поліморфізм за допомогою динамічного (пізнього) зв’язування та віртуальних функцій.
Згідно об'єктно-орієнтованої парадигми, вказівнику на базовий клас можна присвоїти значення адреси об'єкту будь-якого похідного класу. При цьому виклик методів через такий вказівник відбувається у відповідності до типу вказівника, а не до фактичного типу об'єкта, на який він посилається в конкретний момент. Тобто коли звертаємося до функції похідного об'єкту, використовуючи вказівник на базовий клас, викликається функція базового класу. Цей процес носить назву статичного (раннього) зв’язування, коли зв'язки з методами встановлюються жорстко на етапі компіляції програми.
Якщо оголосити функцію віртуальною (virtual), то підключається механізм динамічного (пізнього) зв’язування. У такому випадку версія методу буде визначатися на етапі виконання програми в залежності від типу об'єкта, який викликав метод. Тобто при звертанні до функції похідного об'єкту, використовуючи вказівник на базовий клас, викликатиметься функція похідного класу.
//#INCLUDE "STDAFX.H"
#INCLUDE <IOSTREAM.H>
#INCLUDE "TIME.H"
#INCLUDE <CONIO.H>
#INCLUDE <IOMANIP.H>
#INCLUDE <STDIO.H>
#INCLUDE <STDLIB.H>
#INCLUDE <STRING.H>
//USING NAMESPACE STD;
CHAR P[5];
INT MAIN()
{
ANIMAL *T;
DOG *A;
CAT *B=NEW CAT();
CARD *C;
T=(ANIMAL*)MALLOC(SIZEOF(ANIMAL));
A=(DOG*)MALLOC(SIZEOF(DOG));
C=(CARD*)MALLOC(SIZEOF(CARD));
T->WEIGHT=15;
ANIMAL *POLI=B;
COUT<<"PRESS <<EXIT>> TO EXIT;\NENTER <<EAT>> OR <<WC>>;\NOR ENTER ANIMAL TO HEAR THE VOICE\NENTER <<HELP>> TO SEE THE LIST"<<ENDL<<"TO SEE OZNAKU ENTER<<DOGA>>OR<<COTA>>"<<ENDL<<"DOG TUSUE KARTU: ENTER<<CARD>>"<<ENDL<<"CAT KUDAE MONETU ENTER<<COINS>>"<<"TO SEE POLI ENTER<<POLI>>"<<ENDL;
FOR(;;){
CIN>>P;
IF(!STRCMP(P,"EAT"))
T->FEED();
ELSE IF(!STRCMP(P,"WC"))
T->DOANIMALSTUFF();
ELSE IF (!STRCMP(P,"DOGA"))
{
A->OZNAKAD();
C->CARDDD();
}
ELSE IF (!STRCMP(P,"COTA"))
B->OZNAKAC();
ELSE IF (!STRCMP(P,"CARD"))
A->CARDDD();
ELSE IF (!STRCMP(P,"COINS"))
T->COINSDDD();
//----------------------------------------------------
ELSE IF (!STRCMP(P,"POLI")){
POLI->FUNCTION1();
POLI->FUNCTION2();
}
//----------------------------------------------------
ELSE IF(!STRCMP(P,"EXIT")) BREAK;
ELSE IF(!STRCMP(P,"HELP")) COUT<<"PRESS <<EXIT>> TO EXIT;\NENTER <<EAT>> OR <<WC>>;\NOR ENTER ANIMAL TO HEAR THE VOICE\NENTER <<HELP>> TO SEE THE LIST"<<ENDL<<"TO SEE OZNAKU ENTER<<DOGA>>OR<<COTA>>"<<ENDL<<"DOG TUSUE KARTU: ENTER<<CARD>>"<<ENDL<<"CAT KUDAE MONETU ENTER<<COINS>>";
ELSE{
T->NAME=P;
T->CALL();
}
}
RETURN 0;
}
//#include "stdafx.h"
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
//using namespace std;
class Animal
{
public:
char *name;
int weight;
public:
Animal() {};
~Animal() ;
void Call();
void Feed();
void DoAnimalStuff();
void function1() {cout<<"Animal"<<endl;}
virtual void function2() {cout<<"Animal"<<endl;}
int coinsddd();
};
void Animal::Call(){
if(strcmp(name,"dog")==0)
cout<<" |\\_|\\\n / |\n | 0 0 |\n / |\\\n0_____/\\ gav-gav :)"<<endl;
else if(strcmp(name,"cat")==0)
cout<<" |\\_/|\n | |\n/ 0 0 \\\n\\ ~o~ /\n \\---/\n ^^^ miav-miav :)"<<endl;
else cout<<"no such command"<<endl;
}
void Animal::Feed(){
cout<<(weight+=5)<<"kg"<<endl;
}
void Animal::DoAnimalStuff(){
if (weight<=0) cout<<"animal don't want to do it!"<<endl;
else weight-=3;
cout<<weight<<"kg"<<endl;
}
class Cat:public Animal
{
public:
char c[10];
void oznakac();
void function1() {cout<<"Cat"<<endl;}
virtual void function2() {cout<<"Cat"<<endl;}
};
enum Suit {clubs, diamonds, hearts, spades};
class card
{
public :
int number;
Suit suit;
void carddd();
public:
card( )
{ }
void set (int n, Suit s)
{suit = s; number = n; }
void display ();
};
const int jack = 11;
const int queen = 12;
const int king = 13;
const int ace= 14;
void card ::display ()
{
if (number >=2 && number <=10)
cout<<number;
else
{
switch ( number )
{
case jack :cout<<'J';break;
case queen:cout<<'Q';break;
case king:cout<<'K';break;
case ace:cout<<'A';break;
}
}
switch (suit)
{
case clubs : cout <<static_cast<char>(5); break;
case diamonds : cout <<static_cast<char>(4); break;
case hearts : cout <<static_cast<char>(3); break;
case spades : cout <<static_cast<char>(6); break;
}
}
void card::carddd()
{
card deck [52];
int j;
cout<<endl;
for ( j=0; j<52; j++){
int num = (j%13)+2;
Suit su = Suit (j/13);
deck [ j ].set (num,su);
}
cout <<"koloda card: \n";
for ( j=0; j<52; j++)
{
deck[ j ].display ();
cout<< " ";
if (! ((j+1)%13))
cout <<endl;
}
srand (time (NULL));
for (j=0; j<52; j++)
{
int k =rand ()%52;
card temp = deck[ j ];
deck [ j ] = deck [ k ];
deck[ k ] = temp;
}
cout <<"\n peremishna : \n";
for (j=0; j<52; j++)
{
deck [ j ].display ();
cout<< " ";
if (!((j+1) %13))
cout<<endl;
}
}
class Time
{
public:
Time ();
void printMilitary();
void printStandard();
private:
int ar[3];
};
Time::Time() { ar[0]=0;
ar[1]=0;
ar[2]=0; }
void Time::printMilitary()
{
srand((unsigned) time(NULL));
for(int i=0;i<3; i++)
ar[i]=rand()%2;
}
void Time::printStandard()
{
for(int i=0;i<3; i++)
{
if (ar[i]==1)
cout<<"reshka"<<endl;
else
cout<<"orel"<<endl;
}
}
int Animal::coinsddd ()
{
char ch;
Time t;
while((ch=getch())!='\t')
{
t.printMilitary();
t.printStandard() ;
cout<<"to continue press any key or "<<"to exit press Tab"<<endl;
}
return 0;
}
class Dog:public Animal,public card
{
public:
char d[10];
void oznakad();
};
void Dog::oznakad(){
strcpy(d,"kus'uchiy");
cout<<d<<endl;}
void Cat::oznakac(){
strcpy(c,"drapuchiy");
cout<<c<<endl;}
ВИСНОВОК: Я навчився працювати з поліморфізмами.