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