[ Pretender @ 08.10.2003. 15:28 ] @
Code: 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). Citat: C++ extends its polymorphism to allow pointers to base classes to be assigned to derived class objects. 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 |