Mavzu: Ko’rsatkichlar, havolalar. Ularning avlod-ajdod sinfda qo’llanilishi
Download 463.91 Kb. Pdf ko'rish
|
1-ma\'ruza
3-listing
int main() { Child child(7); Parent &rParent = child; Parent *pParent = &child; cout << " Avlod child" << child.getName() << " va u " << child.getValue() << " qiymatiga ega"<<'\n'; cout << "Avlod rParent " << rParent.getName() << " va u " << rParent.getValue() << " qiymatiga ega"<<'\n'; cout << "Avlod pParent" << pParent->getName() << " va u " << pParent->getValue() << " qiymatiga ega"<<'\n'; return 0; } Ammo bu kutgan yechim boʻla olmasligi mumkin. rParent va pParent ajdod sinfga havola va koʻrsatkich boʻlganligi sababli, ularni faqat ajdod-sinf a’zolari (va ajdoddan meros qolgan har qanday boshqa sinf a’zolari) koʻrishi mumkin. Shunday qilib, ajdod sinf koʻrsatkichi/havolasi Child::getName() ni koʻra olmaydi. Parent::getName() chaqiriladi hamda rParent va pParent Child sinfiga emas, balki Parent sinfiga tegishli ekanligi xabar qilinadi. E'tibor bering, bu Child::getValueDoubled() metodiga rParent yoki pParent orqali murojaat qilish mumkin emasligini ham anglatadi. Avlod sinfida ular hech nimani koʻra olmaydilar. Quyida (4-listing) yana bir murakkabroq dasturni koʻrib chiqaylik. 4-listing #include #include using namespace std; class Animal { protected: string m_name; // Ushbu konstruktorni himoyalangan qilamiz, //chunki foydalanuvchilarning Animal sinfi obyektlarini toʻgʻridan-toʻgʻri //yaratishini xohlamaymiz, lekin avlod sinflariga kirish huquqiga ega boʻlishini xohlaymiz. Animal(string name) { m_name = name; } public: string getName() { return m_name; } const char* speak() { return "???"; } }; class Cat: public Animal { public: Cat(string name) : Animal(name) { } const char* speak() { return "Meow"; } }; class Dog: public Animal { public: Dog(string name) : Animal(name) { } const char* speak() { return "Woof"; } }; int main() { Cat cat("Matros"); cout << "Mushukning ismi " << cat.getName() << " va u " << cat.speak() << " deydi"<<'\n'; Dog dog("Barsik"); cout << "Kuchukning ismi" << dog.getName() << " va u " << dog.speak() << " deydi"<<'\n'; Animal *pAnimal = &cat; cout << "pAnimal ismi " << pAnimal->getName() << " va u " << pAnimal->speak() << " deydi"<<'\n'; pAnimal = &dog; cout << "pAnimal ismi " << pAnimal->getName() << " va u " << pAnimal->speak() << " deydi"<<'\n'; return 0; } Xuddi shu muammoni bu holatda koʻramiz. pAnimal Animal tipidagi koʻrsatkich boʻlgani uchun u faqat Animal qismini koʻra oladi. Demak, Animal::speak(), Dog::speak() yoki Cat::speak() emas, pAnimal->speak() ni chaqiradi. Download 463.91 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling