Tytuł: Funkcje wirtualne Wiadomość wysłana przez: admin Marzec 07, 2012, 09:25:34 Funkcje wirtualne - związane z dziedziczeniem i polimorfizmem w klasach.
Dziedziczenie jest oczywiście niezwykle ważnym, a wręcz niezbędnym składnikiem programowania obiektowego. Stanowi jednak tylko podstawę dla kolejnych technik, mających dużo większe znaczenie i pozwalających na o wiele efektywniejsze pisanie kodu. Są nimi funkcje wirtualne. Funkcje wirtualne, to jakby 'inteligentne' funkcje, które potrafią się dostosować do samego programu. Niech to będzie program gry w którym głównymi graczami są klasy: samochody, różnych marek. Wszystkie samochody są powiązane ze sobą związkami dziedziczenia (potomkowie klasy pojazd). W zależności od rodzaju marki samochodu sposób jego działania będzie inny. Zatem aby wybrać określone działanie w programie umieszcza się liczne instrukcje warunkowe, jak if, czy switch. Po pewnym czasie zamierzono dodać kilka nowych marek samochodów. To proste: definiować nową klasę i.. no właśnie dokonać modyfikacji kodu w funkcjach. Niby nie problem. Wystarczy odszukać wszystkie wystąpienia instrukcji warunkowych dotyczących poszczególnych marek samochodów i dodać kilka linijek kodu. Wydaje się proste. Jednakże w rzeczywistości jest inaczej. Tego typu modyfikacje są bardzo czasochłonne, a ich wykonanie naprawdę bardzo męczące. Ponadto trzeba ingerować w kod źródłowy, co nie zawsze jest osiągalne. Stworzenie takiej funkcje jest naprawdę banalne i skupia się na dodaniu tylko jednego słówka przed deklaracją funkcji! Wystarczy poprzedzić deklarację słówkiem virtual i program stanie się 'inteligentny'. Przykład 1. Deklaracja klasy pojazd i .. #include <cstdlib> #include <iostream> using namespace std; class pojazd { public : virtual void jade() { cout << "Jade...!!!!!" << endl; } }; int main(int argc, char *argv[]) { system("PAUSE"); return EXIT_SUCCESS; } funkcja wirtualna pozwala zmieniać jej zawartość w kolejnych klasach. UWAGA: Klasa abstrakcyjna zawiera przynajmniej jedną czysto wirtualną metodę i z jej powodu nie jest przeznaczona do instancjowania (tworzenia z niej obiektów), a jedynie do wyprowadzania zeń klas pochodnych . Tytuł: Odp: Funkcje wirtualne Wiadomość wysłana przez: admin Marzec 07, 2012, 10:02:58 Przykład 2. Wykorzystanie funkcji wirtualnej
#include <cstdlib> #include <iostream> using namespace std; class pojazd { public : virtual void jade() { cout << "Jade...!!!!!" << endl; } }; class samochod : public pojazd { public : void jade() // redefinicja metody wirtualnej {cout << "Jade na czterech kolach..." <<endl; } void paliwko(){}; }; class motocykl : public pojazd { public : void jade() // redefinicja funkcji wirtualnej { cout << "Jade na dwoch kolach..." <<endl; } void kanister(); }; int main(int argc, char *argv[]) { system("PAUSE"); return EXIT_SUCCESS; } Kompilator sam "domyśla się", że nasza metody jest tak naprawdę redefinicją metody wirtualnej z klasy bazowej. Możemy jednak wyraźnie to zaznaczyć poprzez ponowne zastosowanie słowa virtual Tytuł: Odp: Funkcje wirtualne Wiadomość wysłana przez: admin Marzec 14, 2012, 10:39:47 Przykład z chwaściorkiem
#include <cstdlib> #include <iostream> using namespace std; class drzewo {public: virtual void pien(){cout<<"drzewo"<<endl;}}; class krzaczek :public drzewo {public: void pien(){cout<<"krzaczek"<<endl;}}; int main(int argc, char *argv[]) {drzewo sosenka; krzaczek chwascior; chwascior.pien(); sosenka.pien(); system("PAUSE"); return EXIT_SUCCESS; } |