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();
};
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;
};
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