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