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

virtuelne metode 2

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

[ Pregleda: 3072 | Odgovora: 5 ] > FB > Twit

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 - pre 250 meseci
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



 
Odgovor na temu

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


+3 Profil

icon Re: virtuelne metode 212.10.2003. u 16:50 - pre 249 meseci
Š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
 
Odgovor na temu

Pretender

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



Profil

icon Re: virtuelne metode 212.10.2003. u 19:41 - pre 249 meseci
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)
 
Odgovor na temu

Rapaic Rajko
Bgd

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



+62 Profil

icon Re: virtuelne metode 214.10.2003. u 16:42 - pre 249 meseci
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
 
Odgovor na temu

Pretender

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



Profil

icon Re: virtuelne metode 214.10.2003. u 19:15 - pre 249 meseci
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

 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: virtuelne metode 214.10.2003. u 21:54 - pre 249 meseci
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š.
 
Odgovor na temu

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

[ Pregleda: 3072 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

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