C W4


Informatyka 2
Informatyka 2
Politechnika Białostocka - Wydział Elektryczny
Politechnika Białostocka - Wydział Elektryczny
Elektrotechnika, semestr III, studia stacjonarne I stopnia
Elektrotechnika, semestr III, studia stacjonarne I stopnia
Rok akademicki 2013/2014
Rok akademicki 2013/2014
Wykład nr 4 (12.11.2013)
Wykład nr 4 (12.11.2013)
dr inż. Jarosław Forenc
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
2/45
Plan wykładu nr 4
Plan wykładu nr 4
Programowanie obiektowe w języku C++
destruktor
dynamiczny przydział pamięci w C++
przeładowanie (przeciążenie) operatorów
dziedziczenie
dziedziczenie
funkcje wirtualne (polimorfizm)
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
3/45
Destruktor
Destruktor
destruktor jest wywoływany
class osoba
wtedy, gdy obiekt jest
{
private:
likwidowany (destruktor
char imie[20];
można wywołać jawnie -
char nazwisko[30];
nie spowoduje on jednak
int wiek;
usunięcia obiektu)
public:
public:
osoba(char *i, char *n, int w);
jego nazwa jest taka sama
~osoba(void);
jak nazwa klasy, ale przed
void drukuj(void);
jego nazwą umieszcza się
};
znak ~
osoba::~osoba()
{
zadaniem destruktora jest
...
 posprzątanie po obiekcie,
}
np. zwolnienie pamięci
dla destruktora nie określamy
typu zwracanej wartości
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
4/45
Dynamiczny przydział pamięci w języku C++
Dynamiczny przydział pamięci w języku C++
do dynamicznego przydziału pamięci w języku C++ służy operator new
operator ten alokuje obszar pamięci niezbędny dla przechowywania
obiektu podanego typu i zwraca wskaznik na początek tego obszaru
int *ptr;
ptr = new int;
ptr = new int;
jeśli alokacja pamięci nie jest możliwa, to zwracana jest wartość NULL
przydział pamięci na tablicę n elementów typu int:
int *ptr;
ptr = new int[n];
jako rozmiar tablicy n można podać dowolne wyrażenie
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
5/45
Dynamiczny przydział pamięci w języku C++
Dynamiczny przydział pamięci w języku C++
pamięć przydzielona operatorem new istnieje do zakończenia programu
lub do chwili zwolnienia tej pamięci za pomocą operatora delete
delete ptr;
gdzie ptr jest wskaznikiem wskazującym na obiekt stworzony przez new
gdzie ptr jest wskaznikiem wskazującym na obiekt stworzony przez new
usuwając tablicę, trzeba podać, że chodzi o tablicę, a nie o pojedynczy
element:
delete [] ptr;
gdzie ptr jest wskaznikiem zwróconym przez operator new podczas
tworzenia dynamicznej tablicy
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
6/45
Przykład nr 1 - operatory new i delete (1/2)
Przykład nr 1 - operatory new i delete (1/2)
#include
using namespace std;
int main()
{
int *tab, i, n;
float suma = 0.0;
float suma = 0.0;
cout << "Podaj ilosc liczb: ";
cin >> n;
tab = new int[n];
if (tab == NULL)
{
cout << "Nie mozna przydzielic pamieci" << endl;
exit(-1);
}
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
7/45
Przykład nr 1 - operatory new i delete (1/2)
Przykład nr 1 - operatory new i delete (1/2)
for (i=0; i{
cout << "Podaj liczbe nr " << i+1 << ": ";
cin >> tab[i];
}
for (i=0; ifor (i=0; isuma = suma + tab[i];
cout << "Srednia " << n << " liczb wynosi " << suma/n << endl;
delete [] tab;
}
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
8/45
Przykład nr 1 - operatory new i delete (1/2)
Przykład nr 1 - operatory new i delete (1/2)
Podaj ilosc liczb: 5
for (i=0; iPodaj liczbe nr 1: 1
{
Podaj liczbe nr 2: 2
cout << "Podaj liczbe nr " << i+1 << ": "; nr 3: 3
Podaj liczbe
cin >> tab[i];
Podaj liczbe nr 4: 4
}
Podaj liczbe nr 5: 5
Srednia 5 liczb wynosi 3.000000
Srednia 5 liczb wynosi 3.000000
for (i=0; ifor (i=0; isuma = suma + tab[i];
cout << "Srednia " << n << " liczb wynosi " << suma/n << endl;
;
delete [] tab;
}
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
9/45
Przykład nr 2 - konstruktor i destruktor (1/2)
Przykład nr 2 - konstruktor i destruktor (1/2)
#include
#include
#pragma warning (disable:4996)
using namespace std;
class test
{
{
char name[15];
public:
test(char *n)
{
strcpy(name,n);
cout << "Konstruktor obiektu: " << name << endl;
}
~test()
{
cout << "Destruktor obiektu: " << name << endl;
}
};
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
10/45
Przykład nr 2 - konstruktor i destruktor (2/2)
Przykład nr 2 - konstruktor i destruktor (2/2)
Konstruktor obiektu: t1
int main()
Konstruktor obiektu: t2
{
Aby kontynuować, naciśnij . . .
test t1("t1"), t2("t2");
Konstruktor obiektu: t3
system("pause");
Aby kontynuować, naciśnij . . .
{
Destruktor obiektu: t3
test t3("t3");
test t3("t3");
Aby kontynuować, naciśnij . . .
Aby kontynuować, naciśnij . . .
system("pause");
Destruktor obiektu: t2
}
Destruktor obiektu: t1
Aby kontynuować, naciśnij . . .
system("pause");
return 0;
}
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
11/45
Przykład nr 3 - konstruktor i destruktor (1/3)
Przykład nr 3 - konstruktor i destruktor (1/3)
#include
#include
#pragma warning (disable:4996)
using namespace std;
class osoba
class osoba
{
private:
char *imie;
char *nazwisko;
int wiek;
public:
osoba(char *i, char *n, int w);
~osoba();
void drukuj();
};
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
12/45
Przykład nr 3 - konstruktor i destruktor (2/3)
Przykład nr 3 - konstruktor i destruktor (2/3)
osoba::osoba(char *i, char *n, int w)
{
imie = new char[strlen(i)+1];
nazwisko = new char[strlen(n)+1];
strcpy(imie,i);
strcpy(nazwisko,n);
wiek = w;
wiek = w;
}
osoba::~osoba()
{
delete [] imie;
delete [] nazwisko;
}
void osoba::drukuj()
{
cout << imie << " " << nazwisko;
cout << " " << wiek << endl;
}
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
13/45
Przykład nr 3 - konstruktor i destruktor (3/3)
Przykład nr 3 - konstruktor i destruktor (3/3)
Jan Kos 30
int main()
{
osoba os1("Jan","Kos",30);
os1.drukuj();
}
w kolejnym przykładzie zdefiniujemy funkcję drukuj() jako funkcję
zaprzyjaznioną z klasą
w definicji klasy: friend void drukuj(osoba ktos);
definicja funkcji: void drukuj(osoba ktos)
{
cout << ktos.imie << " " << ktos.nazwisko;
cout << " " << ktos.wiek << endl;
}
wywołanie funkcji: drukuj(os1);
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
14/45
Przykład nr 4 - konstruktor i destruktor (1/3)
Przykład nr 4 - konstruktor i destruktor (1/3)
#include
#include
#pragma warning (disable:4996)
using namespace std;
class osoba
class osoba
{
private:
char *imie;
char *nazwisko;
int wiek;
public:
osoba(char *i, char *n, int w);
osoba(const osoba &os);
~osoba();
friend void drukuj(osoba ktos);
konstruktor kopiujący
};
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
15/45
Przykład nr 4 - konstruktor i destruktor (2/3)
Przykład nr 4 - konstruktor i destruktor (2/3)
osoba::osoba(char *i, char *n, int w)
{
imie = new char[strlen(i)+1];
nazwisko = new char[strlen(n)+1];
strcpy(imie,i);
strcpy(nazwisko,n);
konstruktor kopiujący
wiek = w;
wiek = w;
}
osoba::osoba(const osoba &os)
{
imie = new char[strlen(os.imie)+1];
nazwisko = new char[strlen(os.nazwisko)+1];
strcpy(imie,os.imie);
strcpy(nazwisko,os.nazwisko);
wiek = os.wiek;
}
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
16/45
Przykład nr 4 - konstruktor i destruktor (3/3)
Przykład nr 4 - konstruktor i destruktor (3/3)
Jan Kos 30
osoba::~osoba()
{
delete [] imie;
delete [] nazwisko;
}
void drukuj(osoba ktos)
void drukuj(osoba ktos)
{
cout << ktos.imie << " " << ktos.nazwisko;
cout << " " << ktos.wiek << endl;
}
int main()
{
osoba os1("Jan","Kos",30);
drukuj(os1);
}
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
17/45
Przeładowanie (przeciążanie) operatorów
Przeładowanie (przeciążanie) operatorów
przeładowanie operatora polega na nadaniu mu specjalnego znaczenia
w momencie, gdy stoi on obok obiektu jakiejś klasy
obiektA operator obiektB
klasa obiektA, obiektB, obiektC;
obiektC = obiektA + obiektB;
operator (wymaga napisania własnej funkcji)
operator (może wymagać napisania własnej funkcji)
obiektC = obiektA + 5; obiektC = 5 + obiektB;
operator (wymaga napisania własnych funkcji)
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
18/45
Przeładowanie operatorów w klasie
Przeładowanie operatorów w klasie
przeładowanie operatora dokonuje się definiując funkcję o postaci:
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
19/45
Przeładowanie operatorów w klasie
Przeładowanie operatorów w klasie
można przeładować praktycznie wszystkie operatory
nie można wymyślać swoich operatorów
nie można zmieniać priorytetu operatorów
automatycznie tworzone są operatory:
przypisania (=)
pobrania adresu (&)
new, new [], delete i delete [] (tworzenie i usuwanie obiektów)
ten sam operator można przeładować wielokrotnie, ale za każdym razem
funkcja operatorowa musi mieć inny typ lub kolejność argumentów
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
20/45
Funkcja przeładowująca operator
Funkcja przeładowująca operator
definiowana jako funkcja składowa klasy
obiektA @ obiektB
klasa klasa::operator @ (klasa obiektB)
{
...
}
do funkcji przekazywany jest tylko jeden argument (obiektB),
argument obiektA przekazywany jest domyślnie przez wskaznik this
funkcja operatorowa, która jest składową klasy wymaga, aby obiekt
stojący po lewej stronie operatora był obiektem tej klasy, np.
- można przeładować
obiektA + obiektB
- można przeładować
obiektA + 5
- nie można przeładować!!!
5 + obiektB
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
21/45
Funkcja przeładowująca operator
Funkcja przeładowująca operator
definiowana jako funkcja globalna (zaprzyjazniona z klasą)
obiektA @ obiektB
klasa operator @ (klasa obiektA, klasa obiektB)
{
...
}
aby funkcja globalna mogła korzystać z pól prywatnych klasy musi być
funkcją zaprzyjaznioną z klasą:
friend klasa operator @ (klasa obiektA, klasa obiektB);
umieszczone w definicji klasy
operatory >> i << można przeładowywać tylko jako funkcje globalne
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
22/45
Przykład nr 5 - operacje na macierzach (1/7)
Przykład nr 5 - operacje na macierzach (1/7)
#include
#include
#include
using namespace std;
class macierz
{
{
private:
int size; /* rozmiar macierzy */
int *m; /* wskaznik na macierz */
public:
macierz(int); /* konstruktor */
macierz(const macierz &); /* konstruktor kopiujący */
~macierz(); /* destruktor */
void generuj(int,int);
macierz & operator = (const macierz &);
macierz operator + (macierz);
friend macierz operator - (macierz, macierz);
friend ostream & operator << (ostream &, macierz);
};
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
23/45
Przykład nr 5 - operacje na macierzach (2/7)
Przykład nr 5 - operacje na macierzach (2/7)
macierz::macierz(int n)
{
size = n;
konstruktor klasy macierz
m = new int[n*n];
(z dynamicznym
for (int i=0;iprzydziałem pamięci)
for (int j=0;j*(m+i*size+j) = 0;
*(m+i*size+j) = 0;
}
macierz::macierz(const macierz &mac)
{
size = mac.size;
konstruktor kopiujący
m = new int[size*size];
for (int i=0;ifor (int j=0;j*(m+i*size+j) = *(mac.m+i*size+j);
}
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
24/45
Przykład nr 5 - operacje na macierzach (3/7)
Przykład nr 5 - operacje na macierzach (3/7)
macierz::~macierz()
{
delete [] m;
destruktor
}
void macierz::generuj(int a, int b)
funkcja generująca elementy
{
{
macierzy z zakresu
macierzy z zakresu
for (int i=0;ifor (int j=0;j*(m+i*size+j) = rand()%(b-a+1)+a;
}
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
25/45
Przykład nr 5 - operacje na macierzach (4/7)
Przykład nr 5 - operacje na macierzach (4/7)
macierz & macierz::operator = (const macierz &mac)
{
if (&mac == this)
return *this;
delete [] m;
przeładowanie operatora
size = mac.size;
size = mac.size;
przypisania =, konieczne do
przypisania =, konieczne do
m = new int[size*size];
wykonania operacji typu A=B
for (int i=0;ifor (int j=0;j*(m+i*size+j) = *(mac.m+i*size+j);
return *this;
}
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
26/45
Przykład nr 5 - operacje na macierzach (5/7)
Przykład nr 5 - operacje na macierzach (5/7)
macierz macierz::operator + (macierz mac)
{
macierz wynik(size);
przeładowanie
operatora + w klasie
for (int i=0;ifor (int j=0;j*(wynik.m+i*size+j) = *(m+i*size+j) +
*(mac.m+i*size+j);
*(mac.m+i*size+j);
return wynik;
}
macierz operator - (macierz mac1, macierz mac2)
{
macierz wynik(mac1.size);
przeładowanie
operatora - poza klasą
for (int i=0;ifor (int j=0;j*(wynik.m+i*wynik.size+j) =
*(mac1.m+i*mac1.size+j) -
*(mac2.m+i*mac2.size+j);
return wynik;
}
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
27/45
Przykład nr 5 - operacje na macierzach (6/7)
Przykład nr 5 - operacje na macierzach (6/7)
ostream & operator << (ostream &ekran, macierz mac)
{
for (int i=0;i{
for (int j=0;jekran << *(mac.m+i*mac.size+j) << " ";
ekran << endl;
ekran << endl;
}
przeładowanie
operatora << poza klasą
return ekran;
(inaczej nie można!!!)
}
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
28/45
Przykład nr 5 - operacje na macierzach (7/7)
Przykład nr 5 - operacje na macierzach (7/7)
0 0 0
int main()
0 0 0
{
0 0 0
macierz m1(3), m2(3), m3(3);
0 0 0
srand(unsigned int(time(NULL)));
0 0 0
0 0 0
cout << m1 << endl << m2 << endl;
19 12 16
19 12 16
m1.generuj(10,20);
20 17 12
m2.generuj(-10,10);
12 20 19
cout << m1 << endl << m2 << endl;
-8 0 5
m3 = m1 + m2;
3 0 0
cout << m3 << endl;
4 0 -9
m3 = m1 - m2;
11 12 21
cout << m3 << endl;
23 17 12
}
16 20 10
27 12 11
17 17 12
8 20 28
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
29/45
Dziedziczenie
Dziedziczenie
dziedziczenie jest to technika pozwalającą na definiowanie nowej klasy
przy wykorzystaniu klasy już istniejącej
polega na przejmowaniu jednej klasy (bazowej, podstawowej) przez
inną klasę (pochodną)
przy dziedziczeniu, w skład obiektów klasy pochodnej automatycznie
wchodzą pola klasy bazowej
wchodzą pola klasy bazowej
do obiektów klasy pochodnej możemy stosować operacje zdefiniowane
przez funkcje składowe klasy bazowej
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
30/45
Dziedziczenie - przykłady
Dziedziczenie - przykłady
osoba
imie
nazwisko
wiek
student wykladowca
semestr katedra
wydzial pensum
doktorant
opiekun_naukowy
dziedziczenie wielobazowe
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
31/45
Dziedziczenie - przykłady
Dziedziczenie - przykłady
samochod
...
osobowy ciezarowy
... ...
Ford Fiat Skoda
... ... ...
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
32/45
Dziedziczenie
Dziedziczenie
przykładowa klasa podstawowa i klasa pochodna
/* klasa podstawowa */ /* klasa pochodna */
class osoba class student : public osoba
{ {
char *imie; char *wydzial;
char *imie; char *wydzial;
char *nazwisko; int semestr;
int wiek; public:
public: student(char *i,char *n,
osoba(char *i,char *n,int w); int w,char *wy,int s);
~osoba() ~student()
void drukuj(); void drukuj();
}; void promocja();
};
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
33/45
Dziedziczenie
Dziedziczenie
w klasie pochodnej można zdefiniować:
dodatkowe dane składowe
dodatkowe funkcje składowe
dane i funkcje o takich samych nazwach jak w klasie podstawowej
(dane i funkcje z klasy podstawowej są zasłaniane)
jeśli nie podamy sposobu dziedziczenia, to domyślnie będzie to private
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
34/45
Dziedziczenie - sposoby dziedziczenia
Dziedziczenie - sposoby dziedziczenia
sposób dziedziczenia
private protected public
klasa podstawowa
private - - -
protected private protected protected
public private protected public
podczas dziedziczenia nie są dziedziczone: konstruktor, destruktor
i operator przypisania "="
Przykład:
student st1("Jan","Kos",20,"WE",2); - deklaracja obiektu
st1.drukuj(); - wywołanie funkcji z klasy student
st1.osoba::drukuj(); - wywołanie funkcji z klasy osoba
możliwe jest dziedziczenie wielokrotne, tzn. klasa pochodna może być
klasą podstawową dla innej klasy
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
35/45
Przykład nr 6 - dziedziczenie (1/4)
Przykład nr 6 - dziedziczenie (1/4)
#include
#include
using namespace std;
class osoba
class student : public osoba
{
{
private:
private:
private:
private:
char *imie;
char *wydzial;
char *nazwisko;
int semestr;
int wiek;
public:
public:
student(char*,char*,int,
osoba(char*,char*,int);
char*,int);
~osoba();
~student();
void drukuj();
void drukuj();
};
void promocja();
};
klasa podstawowa klasa pochodna
(bazowa)
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
36/45
Przykład nr 6 - dziedziczenie (2/4)
Przykład nr 6 - dziedziczenie (2/4)
osoba::osoba(char *i, char *n, int w)
{
imie = new char[strlen(i)+1];
nazwisko = new char[strlen(n)+1];
strcpy(imie,i);
konstruktor klasy osoba
strcpy(nazwisko,n);
wiek = w;
wiek = w;
}
osoba::~osoba()
{
delete [] imie;
destruktor klasy osoba
delete [] nazwisko;
}
void osoba::drukuj()
{
cout << imie << " " << nazwisko;
cout << " " << wiek << endl;
}
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
37/45
Przykład nr 6 - dziedziczenie (3/4)
Przykład nr 6 - dziedziczenie (3/4)
student::student(char *i,char *n,int w,char *wy,int s) : osoba(i,n,w)
{
wydzial = new char[strlen(wy)+1];
strcpy(wydzial,wy);
semestr = s;
konstruktor
}
klasy student
klasy student
student::~student()
lista inicjalizacyjna
{
konstruktora klasy student
delete [] wydzial;
zawierająca wywołanie
}
konstruktora klasy
destruktor
void student::drukuj() podstawowej (osoba)
klasy student
{
osoba::drukuj();
cout << "Wydzial: " << wydzial;
cout << " Semestr: " << semestr << endl;
}
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
38/45
Przykład nr 6 - dziedziczenie (4/4)
Przykład nr 6 - dziedziczenie (4/4)
void student::promocja()
jako pierwszy zostanie wywołany
{
konstruktor klasy podstawowej
semestr++;
(osoba) a po nim konstruktor klasy
}
pochodnej (student)
int main()
{
{
student st1("Jan","Kowalski",20,"WE",2);
st1.drukuj();
st1.promocja();
st1.drukuj();
st1.osoba::drukuj();
}
kolejność wywołania destruktorów jest odwrotna w stosunku do
konstruktorów - jako pierwszy jest wywoływany destruktor klasy student,
a po nim destruktor klasy osoba
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
39/45
Przykład nr 6 - dziedziczenie (4/4)
Przykład nr 6 - dziedziczenie (4/4)
Jan Kowalski 20
void student::promocja()
Wydzial: WE Semestr: 2
jako pierwszy zostanie wywołany
{
Jan Kowalski 20
konstruktor klasy podstawowej
semestr++;
Wydzial: WE Semestr: 3
(osoba) a po nim konstruktor klasy
}
Jan Kowalski 20
pochodnej (student)
int main()
{
{
student st1("Jan","Kowalski",20,"WE",2);
st1.drukuj();
st1.promocja();
st1.drukuj();
st1.osoba::drukuj();
}
kolejność wywołania destruktorów jest odwrotna w stosunku do
konstruktorów - jako pierwszy jest wywoływany destruktor klasy student,
a po nim destruktor klasy osoba
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
40/45
Funkcje wirtualne (polimorfizm)
Funkcje wirtualne (polimorfizm)
Przykład:
załóżmy, że piszemy program wyświetlający
na ekranie różne figury (kwadrat, trójkąt, koło)
do wyświetlenia każdej figury stosowana jest
oddzielna funkcja, figury powinny być
wyświetlane na ekranie w określonej kolejności
wyświetlane na ekranie w określonej kolejności
Problem: jak zorganizować przechowywanie informacji o figurach?
jak zorganizować wyświetlanie figur?
Rozwiązanie: klasy + dziedziczenie + funkcje wirtualne
definiujemy klasę podstawową (figura) oraz trzy klasy pochodne (kwadrat,
trojkat, kolo)
w klasie podstawowej umieszczamy funkcję void rysuj() poprzedzoną słowem
virtual (funkcja ta nic nie robi)
w klasach pochodnych umieszczamy funkcje o takich samych nazwach jak
w klasie podstawowej - void rysuj() wyświetlające poszczególne figury
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
41/45
Przykład nr 7 - funkcje wirtualne (1/3)
Przykład nr 7 - funkcje wirtualne (1/3)
#include
using namespace std;
klasa podstawowa figura
class figura
{
funkcja wirtualna rysuj()
public:
virtual void rysuj() { };
virtual void rysuj() { };
};
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
42/45
Przykład nr 7 - funkcje wirtualne (2/3)
Przykład nr 7 - funkcje wirtualne (2/3)
class kwadrat : public figura
klasa pochodna kwadrat
{
public:
void rysuj() { cout << "Kwadrat" << endl; }
};
class trojkat : public figura
class trojkat : public figura
klasa pochodna trojkat
{
public:
void rysuj() { cout << "Trojkat" << endl; }
};
class kolo : public figura
{ klasa pochodna kolo
public:
void rysuj() { cout << "Kolo" << endl; }
};
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
43/45
Funkcje wirtualne (polimorfizm)
Funkcje wirtualne (polimorfizm)
jeśli wskaznikowi do klasy podstawowej (figura) przypiszemy adres obiektu
klasy pochodnej (kwadrat, trojkat, kolo), to wywołując poprzez wskaznik
funkcję rysuj(), wywołamy funkcję odpowiadającą danemu obiektowi, np.
figura *ptr; - deklaracja wskaznika do obiektu klasy figura
kwadrat kw1; - deklaracja obiektu klasy kwadrat
trojkat tr1; - deklaracja obiektu klasy trojkat
trojkat tr1; - deklaracja obiektu klasy trojkat
kolo kol1; - deklaracja obiektu klasy kolo
ptr = &kw1;
ptr->rysuj(); - wywołana zostanie funkcja rysuj() z klasy kwadrat
ptr = &tr1;
ptr->rysuj(); - wywołana zostanie funkcja rysuj() z klasy trojkat
ptr = &kol1;
ptr->rysuj(); - wywołana zostanie funkcja rysuj() z klasy kolo
mówimy, że w powyższym przykładzie wystąpił polimorfizm
(wielopostaciowość)
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
44/45
Przykład nr 7 - funkcje wirtualne (3/3)
Przykład nr 7 - funkcje wirtualne (3/3)
Trojkat
int main()
Kwadrat
{
Kolo
kwadrat kwadrat1, kwadrat2;
Kwadrat
trojkat trojkat1, trojkat2;
Kolo
Trojkat
kolo kolo1, kolo2;
figura *lista[6];
lista[0] = &trojkat1;
lista[1] = &kwadrat1;
lista[2] = &kolo1;
lista[3] = &kwadrat2;
lista[4] = &kolo2;
lista[5] = &trojkat2;
for (int i=0; i<6; i++)
lista[i]->rysuj();
}
Informatyka 2, studia stacjonarne I stopnia dr inż. Jarosław Forenc
Rok akademicki 2013/2014, Wykład nr 4
45/45
Koniec wykładu nr 4
Koniec wykładu nr 4
Dziękuję za uwagę!
Dziękuję za uwagę!
Dziękuję za uwagę!
Dziękuję za uwagę!


Wyszukiwarka

Podobne podstrony:
AiSD w4 sortowanie2
F2 W4 dielektryki
w4
ML1 W4 1 (2)
W4 MECH EN
W4 PODSTAWY PROJEKTOWANIA KONSTRUKCJI NS
W4 Wymiana gospodarcza z zagranica
Finanse w4
W4 ZIP Podstawy metrologii elekt
Przykład do W4
hih w4
pca w4
TSZ MBM w4
notatki W4
W4 3therawchef com the raw chef Lime amp Ginger Mascarpone IceCream
C w4 funkcje mem lancuchy
w4

więcej podobnych podstron