Mavzu: Ko’rsatkichlar, havolalar. Ularning avlod-ajdod sinfda qo’llanilishi


Download 463.91 Kb.
Pdf ko'rish
bet2/4
Sana11.02.2023
Hajmi463.91 Kb.
#1189856
1   2   3   4
Bog'liq
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:
1   2   3   4




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling