[ Pretender @ 10.10.2003. 18:04 ] @
Evo nekoliko uocenih "stilova" pisanja virtuelnih f. (bez ikakvog autorovog objasnjenja).


Varijanta 1

5: class Mammal
11: virtual void Speak() const { cout << "Mammal speak!\n";

17: class Dog : public Mammal
23: void Speak()const { cout << "Woof!\n";

Varijanta 2

5: class Mammal
12: virtual Mammal* Clone() { return new Mammal(*this);

23: class Dog : public Mammal
30: virtual Mammal* Clone() { return new Dog(*this);

Varijanta 3

1: // Listing 13.2 Using dynamic_cast.
2: // Using rtti
3:
4: #include <iostream.h>
5: enum TYPE { HORSE, PEGASUS };
6:
7: class Horse
8: {
9: public:
10: virtual void Gallop(){ cout << "Galloping...\n"; }
11:
12: private:
13: int itsAge;
14: };
15:
16: class Pegasus : public Horse
17: {
18: public:
19:
20: virtual void Fly() { cout << "I can fly! I can fly! I can fly!\n";}
21: };
22:
23: const int NumberHorses = 5;
24: int main()
25: {
26: Horse* Ranch[NumberHorses];
27: Horse* pHorse;
28: int choice,i;
29: for (i=0; i<NumberHorses; i++)
30: {
31: cout << "(1)Horse (2)Pegasus: ";
32: cin >> choice;
33: if (choice == 2)
34: pHorse = new Pegasus;
35: else
36: pHorse = new Horse;
37: Ranch = pHorse;
38: }
39: cout << "\n";
40: for (i=0; i<NumberHorses; i++)
41: {
42: Pegasus *pPeg = dynamic_cast< Pegasus *> (Ranch);
42: if (pPeg)
43: pPeg->Fly();
44: else
45: cout << "Just a horse\n";
46:
47: delete Ranch;
48: }
49: return 0;
50:


Ko je ovde lud? Ima li nekog pravila kod pisanja imena virtuelnih f-ja ili je to stvar trenutne inspiracije.

U varijanti 3, naveo sam ceo kod jer, kada izbrisem virtual ispred Fly, program se uspesno kompajlira, a ako uklonim i virtual ispred Gallop, javlja se greska u lin. 42.

Ovo sam radio zato sto ne vidim vezu izmedju metoda Fly i Gallop, te sam hteo da dokazem da Fly moze da radi nezavisno od Gallopa (u cemu sam, meni se cini, cak delimicno i uspeo).


Tx



[ filmil @ 12.10.2003. 16:50 ] @
Što se tiče prve dve varijante, moram priznati da mi nije jasno šta si tu ilustrovao.

Što se tiče drugog pitanja, opet mi nije jasno šta si mislio da uradiš, a i kod je malo nečitak. Možda bi pomoglo ako bi napravio najmanji mogući primer koji se može kompajlirati, a da je dobro iskomentarisan. Verujem ja da se tu negde krije smisao onoga što želiš da pitaš, ali mnogo je bolje da nam lepo objasniš šta ti nije jasno nego da gledamo u bob. :)

f
[ Pretender @ 12.10.2003. 19:41 ] @
Pa, hteo sam da kazem (onim boldovima) da se negde uz virtuelnu f-ju u derived klasi pise virtual, a negde ne (varijante 1 i 2); i da se za `izvedenu` f-ju negde (var.3) cak koristi razlicito ime od imena `bazne` virtuelne f-je (Gallop i Fly)
[ Rapaic Rajko @ 14.10.2003. 16:42 ] @
Pretender,

sto se tice deklaracije "virtual", kad se radi override postojece virtualne funkcije moze, a ne mora da se stavi.
Treci primer iz knjige je, sad sam siguran, namerno osakacen. Drugim recima, imas neispravan kod. Zasto, ne bih znao.... Kako bilo, stavi ove izmene:
Code:

  37: Ranch[i] = pHorse;

zatim
Code:

  42: Pegasus *pPeg = dynamic_cast< Pegasus *> (Ranch[i]);

i na kraju
Code:

  delete Ranch [];


Probaj sad, pa javi

Rajko
[ Pretender @ 14.10.2003. 19:15 ] @
Uh, Rajko izvini; za ove nedostatke sam kriv ja.

Ceo ovaj kod, nisam stavio u code format, da bih mogao da koristim bold i italic u
njemu. Medjutim, posle nekog petljanja sa italicom, krenuo sam mehanicki sa
brisanjem (i), i pri tom obrisao nekoliko indexa.(glupo, priznajem!)
Mislim da sam ovo i `ispravio`, ali je ispravka verovatno failovala, a da ja to nisam dalje kontrolisao. Jos jednom sorry.

Ostaje pitanje, kako je metod Fly nasledjen(overrideom) od metoda
Gallop, kada imaju razlicita imena ?
A, da izmedju njih postoji neka veza pokazuje i to sto, ukoliko se obrise virtual ispred Gallop, compile ne uspeva.(dok brisanje virtual ispred Fly, ne pravi problem)


Tx

[ Dragi Tata @ 14.10.2003. 21:54 ] @
1. Ono delete na kraju ne briše ništa - moraš da obrišeš svaki Horse* posebno, a čak i tada u opštem slučaju (verovatno ne ovde, jer Pegasus nema data članove) možeš da imaš problema Horse destruktor nije virtuelan.

2. Fly nema nikakve veze sa Gallop. Greška u kompajliranju nastaje zato što Horse više nije polimorfni tip - tj nema nijednu virtuelnu funkciju, a dynamic_cast ne može da radi sa ne-polimorfnim tipovima. Dodaj virtuelni destruktor:

Code:
virtual ~Horse(){}


i sve će da bude OK.

3. Molim te nađi negde "Accelerated C++" (makar kopiju kopije) i batali tu knjigu po kojoj radiš.