Darmowe Forum

C++ => Podstawy C++ cz. I => Wątek zaczęty przez: admin Marzec 07, 2012, 09:25:34



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


Polityka cookies
Darmowe Fora | Darmowe Forum

filtrowa36 mundodetelenovelas coolcraft slimrpg avallonandaballava