1: //Listing 12.8 Using virtual methods
2:
3: #include <iostream.h>
4:
5: class Mammal
6: {
7: public:
8: Mammal():itsAge(1) { cout << "Mammal constructor...\n"; }
9: ~Mammal() { cout << "Mammal destructor...\n"; }
10: void Move() const { cout << "Mammal move one step\n"; }
11: virtual void Speak() const { cout << "Mammal speak!\n"; }
12: protected:
13: int itsAge;
14:
15: };
16:
17: class Dog : public Mammal
18: {
19: public:
20: Dog() { cout << "Dog Constructor...\n"; }
21: ~Dog() { cout << "Dog destructor...\n"; }
22: void WagTail() { cout << "Wagging Tail...\n"; }
23: void Speak()const { cout << "Woof!\n"; }
24: void Move()const { cout << "Dog moves 5 steps...\n"; }
25: };
26:
27: int main()
28: {
29:
30: Mammal *pDog = new Dog;
31: pDog->Move();
32: pDog->Speak();
33:
34: return 0;
35: }
Output: Mammal constructor...
Dog Constructor...
Mammal move one step
Woof!
Uvodjenje odrednice VIRTUAL, izgleda da vise dotice nevirtuelne f-je, jer bez toga normalno koristimo override u izvedenim klasama, a kada uvedemo VIRTUAL onda je override moguc samo sa virtuelnim f-jama, dok se nevirtuelne ne izvrsavaju, vec se umesto njih izvr. istoimene metode iz bazne klase.
E sad, da li je cela ova masinerija uvedena zato, da bi smo mogli da pozovemo bas bazni metod Move()(specijalno kreiranim pointerom pDog), iako imamo definisan istoimeni metod u izvedenom objektu (tj. da bi mogli da biramo izmedju base i derived metoda).
Ali sta ako hocemo bazni Speak() metod? Njega smo (zato sto je virtuelan) overrideom sakrili , i sad iz izvedene klase, njemu nemamo pristup.
Znaci, ako bazni metod proglasimo za VIRTUAL ne mozemo mu vise pristupiti iz izvedene klase.
Dakle, o cemu se radi ?
Hvala