Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Programowanie obiektowe PO PO - LAB 3 Wojciech Pieprzyca.

Podobne prezentacje


Prezentacja na temat: "Programowanie obiektowe PO PO - LAB 3 Wojciech Pieprzyca."— Zapis prezentacji:

1 Programowanie obiektowe PO PO - LAB 3 Wojciech Pieprzyca

2 Funkcja zaprzyjaźniona z klasą to funkcja, która ma dostęp do wszystkich składników klasy pomimo tego, że sama nie jest metodą tej klasy. class punkt { friend void stan(punkt &p); private: int x,y; }; void stan(punkt &p) { cout << Wsp. X: << p.x << endl; cout << Wsp. Y: << p.y << endl; } Funkcja stan ma dostęp do prywatnych składowych x i y klasy punkt. Funkcje zaprzyjaźnione (I) PO

3 Funkcji zaprzyjaźnionych używa się zwykle wtedy, gdy utworzenie jej jako metody klasy jest utrudnione lub też gdy chcemy mieć dostęp do składowych kilku klas jednocześnie. Oprócz funkcji zaprzyjaźnionych globalnie, klasa może także deklarować przyjaźń z inną klasą lub z konkretną metodą klasy. Przykładem może być funkcja mnożąca dwie macierze, która musi mieć jednocześnie dostęp do dwóch obiektów klasy macierz. class macierz { friend macierz mnoz(Macierz a, Macierz b) private: int el[5][5]; }; macierz mnoz(Macierz a, Macierz b) { …… } Funkcje zaprzyjaźnione (II) PO

4 Przykład 2: class prostokat; //zapowiedz pozniejszej definicji klasy prostokat class kwadrat { private: int a; public: kwadrat(int _a); friend int pole(kwadrat k, prostokat p); }; class prostokat { private: int a,b; public: prostokat(int _a, int _b); friend int pole(kwadrat k, prostokat p); }; Funkcje zaprzyjaźnione (III) PO

5 //konstruktor dla klasy kwadrat kwadrat::kwadrat(int _a) { a = _a; } //konstruktor dla klasy prostokat prostokat::prostokat(int _a, int _b) { a = _a; b = _b; } Funkcje zaprzyjaźnione (IV) PO

6 //fukcja pole ma dostęp do składowych zarówno klasy kwadrat //jak i klasy prostokat int pole(kwadrat k, prostokat p) { int pk=0, pp=0; pk = k.a*k.a; pp = p.a*p.b; cout << Pole kwadratu: << pk << endl; cout << Pole prostokata: << pp << endl; } int main() { kwadrat k(3); prostokat p(3,4); pole(k,p); } Funkcje zaprzyjaźnione (V) PO

7 Funkcja wirtualna pozwala w klasach pochodnych zastępować implementację metod dostarczonych przez klasę bazową. W tym celu najczęściej wykorzystuje się zmienną wskaźnikową, która może wskazywać na obiekty klasy bazowej i obiekty klas pochodnych. W przypadku istnienia kilku metod zastępczych w różnych klasach pochodnych, to która metoda zostanie uruchomiona jest uzależnione od typu obiektu na jaki aktualnie wskazuje zmienna wskaźnikowa. W podanym przykładzie pojawią się 4 definicje metody pole, której zadaniem będzie obliczanie pola odpowiedniej figury. Klasa figura jest tutaj klasą bazową dla 3 klas pochodnych: prostokat, trojkat, romb. Funkcje wirtualne (I) PO figura prostokattrojkatromb

8 //klasa bazowa – figura class figura { public: float a,b; figura(int _a, int _b); virtual void pole() { cout << Nie zdefiniowana funkcja obliczajaca pole; } }; //klasa pochodna – prostokat class prostokat : public figura { public: prostokat(int a, int b):figura(a,b) {} virtual void pole() { cout << Pole prostokata: << a*b << endl; } }; Funkcje wirtualne (II) PO

9 //klasa pochodna - trojkat class trojkat : public figura { public: trojkat(int a, int b):figura(a,b) {} virtual void pole() { cout << Pole trojkat: << 0.5*a*b << endl; } }; //klasa pochodna – romb class romb : public figura { public: romb(int a, int b):figura(a,b) {} }; //konstruktor klasy figura figura::figura(int _a, int _b) { a = _a; b = _b; } Funkcje wirtualne (III) PO

10 int main() { //zmienna wskaźnikowa, która może wskazywać zarówno na obiekty //klasy bazowej - figura, jak i obiekty klas pochodnych - prostokat, trojkat, romb figura *wsk = 0; prostokat p(4,2); trojkat t(3,4); romb r(2,3); //na początku wskaźnik pokazuje na obiekt typu prostokąt, //wywołana zostanie metoda pole z klasy prostokąt wsk = &p; wsk->pole(); //teraz wskaźnik pokazuje na obiekt typu trójkąt //wywołana zostanie metoda pole z klasy trójkąt wsk = &t; wsk->pole(); //zmiana - wskaźnik pokazuje na obiekt typu romb //wywołana zostanie metoda pole z klasy romb wsk = &r; wsk->pole(); } Funkcje wirtualne (IV) PO


Pobierz ppt "Programowanie obiektowe PO PO - LAB 3 Wojciech Pieprzyca."

Podobne prezentacje


Reklamy Google