Darmowe Forum
Kwiecień 27, 2024, 19:06:14 *
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 3694 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

imindel tdw magiaslonca zaburzenia wladca-smokow