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

spw mylittlepony shaggydogss zlotasiodemka blackmoon