Darmowe Forum
Grudzieñ 30, 2024, 18:44:49 *
Witamy, Go¶æ. Zaloguj siê lub zarejestruj.
Czy dotar³ do Ciebie email aktywacyjny?

Zaloguj siê podaj±c nazwê u¿ytkownika, has³o i d³ugo¶æ sesji
Aktualno¶ci: Forum zosta³o uruchomione!
 
   Strona g³ówna   Pomoc Zaloguj siê Rejestracja  
Strony: [1]
  Drukuj  
Autor W±tek: Funkcje wirtualne  (Przeczytany 3907 razy)
admin
Administrator
Ekspert
*****
Wiadomo¶ci: 821


Email
« : 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 .
« Ostatnia zmiana: Marzec 07, 2012, 10:38:16 wys³ane przez admin » Zapisane
admin
Administrator
Ekspert
*****
Wiadomo¶ci: 821


Email
« Odpowiedz #1 : 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
Zapisane
admin
Administrator
Ekspert
*****
Wiadomo¶ci: 821


Email
« Odpowiedz #2 : 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;
}
Zapisane
Strony: [1]
  Drukuj  
 
Skocz do:  

Powered by SMF 1.1.11 | SMF © 2006-2008, Simple Machines LLC | Sitemap

Polityka cookies
Darmowe Fora | Darmowe Forum

proskills moikrewni zlotasiodemka polski-serwer-rpg blackmoon