background image

Laboratorium nr 12 

 

Temat: Polimorfizm oraz funkcje wirtualne.. 

 

1. Koncepcja polimorfizmu oraz funkcji wirtualnych w C++ 

 

Polimorfizm:  oznacza  istnienie  kilku  wersji funkcji  lub  operatorów  o tej samej  nazwie.  W C++ 

mamy  dwie  formy  polimorfizmu:  statyczny  (wykonywany  w  czasie  kompilacji)  oraz  dynamiczny. 

Polimorfizm  statyczny  odnosi  si   do  przeci ania  funkcji  oraz  operatorów  natomiast  polimorfizm 

dynamiczny jest realizowany przy wykorzystaniu funkcji wirtualnych. Ró nica pomi dzy polimorfizmem 

statycznym  a  dynamicznym  polega  na  tym,  e  w  statycznym  C++  wybiera  odpowiedni   wersj  

przeci onej  funkcji  podczas  kompilacji.  W  polimorfizmie  dynamicznym  C++  znajduje  odpowiednia 

wersj  przeci onej funkcji na podstawie wska nika do obiektu. 

 

Funkcje  wirtualne:  ich  koncepcja  jest  podobne  do  przeci ania  funkcji,  z  tym,  e  w  przypadku 

funkcji wirtualnych mo emy zast pi  ich definicj  w klasie bazowej, nowa definicj  w klasie pochodnej. 

W tym celu nale y w klasie bazowej nale y poprzedzi  definicj  funkcji słowem virtual

 

class klasa { 

 

public: 

 

 

virtual typ funkcja (argumenty); 

 

 

class nowa:public klasa{ 

 

public: 

 

 

int funkcja (argumenty); 

 

Uwaga:  w  C++  istnieje  tak e  koncepcja  czystych  funkcji  wirtualnych,  to  znaczy  takich,  dla  których 

wyst puje jedynie deklaracji w klasie bazowej zako czona znakiem „=0”. W klasach pochodnych nale y 

wówczas zamieni  czyst  funkcj  wirtualna jej deklaracj . Klasa, która zawiera czyste funkcje wirtualne 

nazywa si  klas  abstrakcyjn  i nie mo e istnie   aden obiekt tej klasy 

 

… 

 

 

virtual typ funkcja (argumenty)=0;   

! czysta funkcja wirtualna 

 

# include <conio.h> 
# include <iostream> 
# include <iomanip.h> 
 
using namespace std; 
 
class macierz { 
public: 
    int x,y; 
    virtual int wyswietl(void)=0; 
}; 
 
class itg:public macierz { 
public: 
    int *tab; 
    int wyswietl (void); 
    int wprowadz (int w); 
    itg(int n, int m); 
    ~itg(); 
}; 
 
class flt:public macierz { 
public: 
    float *tab; 
    int wyswietl (void); 
    int wprowadz (float w); 
    flt(int n, int m); 
    ~flt(); 
}; 

background image

int itg::wyswietl(void){ 
   cout << "\nMacierz: Integer" << endl; 
   for (int i=0; i<x; i++) { 
         for (int j=0; j<y; j++) cout << setw(4) << *(tab+y*i+j) << "\t"; 
         cout <<"\n"; 
   }; 
}; 
 
int itg::wprowadz (int w) { 
    for(int i=0;i<x;i++) 
        for(int j=0;j<y;j++) 
           *(tab+y*i+j)= w; 
   return 0; 
}; 
 
itg::itg(int n, int m){ 
   x=n; 
   y=m; 
   tab=new int[n*m]; 
   for (int i=0; i<n; i++) 
   for (int j=0; j<m; j++) 
   *(tab+y*i+j)=0; 

 
itg::~itg(){ 
   delete[] tab; 
}; 
 
int flt::wyswietl (void){ 
   cout << "\nMacierz: Float" << endl; 
   for (int i=0; i<x; i++) { 
         for (int j=0; j<y; j++) cout << setw(5) << setprecision(5) << *(tab+y*i+j) 
<< "\t"; 
         cout <<"\n"; 
   }; 
}; 
 
int flt::wprowadz (float w) { 
    for(int i=0;i<x;i++) 
        for(int j=0;j<y;j++) 
           *(tab+y*i+j)=w; 
   return 0; 
}; 
 
flt::flt(int n, int m){ 
   x=n; 
   y=m; 
   tab=new float[n*m]; 
   for (int i=0; i<n; i++) 
   for (int j=0; j<m; j++) 
   *(tab+y*i+j)=0; 

 
flt::~flt(){ 
   delete[] tab; 
}; 

background image

int main() { 
class itg A(3,3); 
class flt B(3,3); 
    A.wprowadz(1); 
    A.wyswietl(); 
    B.wprowadz(1.1); 
    B.wyswietl(); 
    system("PAUSE"); 
    delete &A; 
    delete &B; 
return 0; 

 

2. Zadanie: 

Zmodyfikuj  powy szy  program  tak,  aby  umo liwiał  deklaracje  szeregu  macierzy  o  dowolnych 

wymiarach  i  typach  (integer,  float,  char,  itp.)  oraz  podstawowe  działania  na  macierzach  (dodawanie, 

mno enie, transpozycja, itp.) z wykorzystaniem funkcji wirtualnych.  

 

Uwaga:  

•  Program  powinien  składa   si   z  oddzielnych  plików,  tzn.  pliku  głównego  oraz  plików 

zdefiniowanych klas, itp. 

•  Program  powinien  posiada   szereg  zabezpiecze ,  np.  sprawdzanie  czy  wybrane  macierzy  maj  

odpowiednie typy i wymiary oraz czy istnieje przestrze  na utworzenie kolejnej macierzy, itp. 

 

Program powinien posiada  krótkie menu wyboru, np.: 

1.

  Utwórz macierz: integer, float, char 

2.

  Wy wietl macierz 

3.

  Wypełnij macierz – dane losowe 

4.

  Dodaj macierze 

5.

  Pomnó  macierze 

6.

  itp. 

7.

  Koniec