r14-06.doc

Post on 05-Nov-2015

215 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Szablon dla tlumaczy

2

Cz I ( Podstawy obsugi systemu WhizBang (Nagwek strony)

Rozdzia 14.Polimorfizm

Z rozdziau 12. dowiedziae si, jak pisa funkcje wirtualne w klasach wyprowadzonych. Jest to jedna z podstawowych umiejtnoci potrzebnych przy posugiwaniu si polimorfizmem, czyli moliwoci przypisywania ju podczas dziaania programu specyficznych obiektw klas pochodnych do wskanikw wskazujcych na obiekty klasy bazowej.

Z tego rozdziau dowiesz si:

czym jest dziedziczenie wielokrotne i jak z niego korzysta,

czym jest dziedziczenie wirtualne,

czym s abstrakcyjne typy danych,

czym s czyste funkcje wirtualne.

Problemy z pojedynczym dziedziczeniem

Przypumy, e od pewnego czasu pracujemy z naszymi klasami zwierzt i e podzielilimy hierarchi klas na ptaki (Bird) i ssaki (Mammal). Klasa Bird posiada funkcj skadow Fly() (latanie). Klasa Mammal zostaa podzielona na rne rodzaje ssakw, midzy innymi na klas Horse (ko). Klasa Horse posiada funkcje skadowe Whinny() (renie) oraz Gallop() (galopowanie).

Nagle okazuje si, e potrzebujemy obiektu pegaza (Pegasus): skrzyowania konia z ptakiem. Pegasus moe lata (metoda Fly()), ale take moe re (Whinny()) i galopowa (Gallop()). Przy dziedziczeniu pojedynczym okazuje si, e jestemy w kropce.

Moemy uczyni z pegaza obiekt klasy Bird, ale wtedy nie bdzie mg re ani galopowa. Moemy zrobi z niego obiekt Horse, ale wtedy nie bdzie mg lata.

Pierwsz prb rozwizania tego problemu moe by skopiowanie metody Fly() do klasy Pegasus i wyprowadzenie tej klasy z klasy Horse. Bdzie to prawidowa operacja, przeprowadzona jednak kosztem posiadania metody Fly() w dwch miejscach (w klasach Bird i Pegasus). Gdy zmienisz j w jednym miejscu, musisz pamita o wprowadzeniu modyfikacji take w drugim. Oczywicie, programista, ktry kilka miesicy czy lat pniej sprbuje zmodyfikowa taki kod, take musi wiedzie o obu miejscach.

Wkrtce jednak pojawia si nowy problem. Chcemy stworzy list obiektw typu Horse oraz list obiektw typu Bird. Chcielibymy doda obiekt klasy Pegasus do dowolnej z tych list, ale gdyby Pegasus zosta wyprowadzony z klasy Horse, nie moglibymy go doda do listy obiektw klasy Bird.

Istnieje kilka rozwiza tego problemu. Moemy zmieni nazw metody Gallop() na Move() (ruch), a nastpnie przesoni metod Move() w klasie Pegasus tak, aby wykonywaa prac metody Fly(). Nastpnie przesonilibymy metod Move() innych koni tak, aby wykonywaa prac metody Gallop(). By moe pegaz byby inteligentny na tyle, by galopowa na krtkich dystansach, a lata tylko na duszych:

Pegasus::Move(long distance)

{

if (distance > veryFar)

Fly(distance);

else

Gallop(distance);

}

To rozwizanie posiada jednak pewne ograniczenia. By moe ktrego dnia pegaz zechce lata na krtkich dystansach lub galopowa na duszych. Nastpnym rozwizaniem mogoby by przeniesienie metody Fly() w gr, do klasy Horse, co zostao pokazane na listingu 14.1. Problem jednak polega na tym, i zwyke konie nie potrafi lata, wic w przypadku koni innych ni pegaz, ta metoda nie bdzie nic robi.

Listing 14.1. Gdyby konie umiay lata...

0: // Listing 14.1. Gdyby konie umiay lata...

1: // Przeniesienie metody Fly() do klasy Horse

2:

3: #include

4: using namespace std;

5:

6: class Horse

7: {

8: public:

9: void Gallop(){ cout

top related