Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

virtuelne metode 2

[es] :: C programiranje :: virtuelne metode 2

[ Pregleda: 1108 | Odgovora: 5 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Pretender

Član broj: 12407
Poruke: 100
212.124.182.*



Profil

icon virtuelne metode 210.10.2003. u 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



10.10.2003. u 18:04 

filmil
Filip Miletić
Oce Technologies B.V., inženjer hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.adsl.zonnet.nl

Jabber: filmil@jabber.org
ICQ: 36601391


Profil

icon Re: virtuelne metode 212.10.2003. u 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
12.10.2003. u 16:50 

Pretender

Član broj: 12407
Poruke: 100
*.beotel.net



Profil

icon Re: virtuelne metode 212.10.2003. u 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)
12.10.2003. u 19:41 

Rapaic Rajko
programer, Grappolo
Bgd

Član broj: 4105
Poruke: 410
*.pexim.co.yu



Profil

icon Re: virtuelne metode 214.10.2003. u 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
14.10.2003. u 16:42 

Pretender

Član broj: 12407
Poruke: 100
*.beotel.net



Profil

icon Re: virtuelne metode 214.10.2003. u 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

14.10.2003. u 19:15 

Dragi Tata

Član broj: 1958
Poruke: 3899
199.171.112.*

Sajt: www.novetehnologije.com


Profil

icon Re: virtuelne metode 214.10.2003. u 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š.
14.10.2003. u 21:54 

[es] :: C programiranje :: virtuelne metode 2

[ Pregleda: 1108 | Odgovora: 5 ]

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.