Oxirgi misol.
class Parent
{
public:
int m_public;
private:
int m_private;
protected:
int m_protected;
};
Parent sinf o'z a'zolariga muammosiz kirishi mumkin. m_public ga kirish hamma uchun ochiq. Avlod sinflari m_public va m_protected-ga kirishlari mumkin:
class D2 : private Parent // yopiq meros olish
{
int m_public2;
private:
int m_private2;
protected:
int m_protected2;
};
D2 klassi o'z a'zolariga erkin kirishi mumkin. D2 ajdod-sinfning m_public va m_protected a'zolariga kirishi mumkin, lekin m_privatega emas. D2 ajdod private sinfini meros qilib olganligi sababli, m_public va m_protected endi D2 orqali kirishda privatedir. Bu shuni anglatadiki, boshqa obyektlar D2 obyektidan foydalanish orqali ushbu a'zolarga kira olmaydi va D2 sinfining avlodlari bo'lgan boshqa sinflar bu a'zolarga kira olmaydi:
class D3 : public D2
{
// Umumiy meros deganda:
// - meros qilib olingan jamoat a'zolari bolalar sinfida ochiq qoladi;
// - meros qilib olingan himoyalangan a'zolar bolalar sinfida himoyalangan qoladi;
// - meros qilib olingan shaxsiy a'zolar bolalar sinfida mavjud bo'lmaydi.
public:
int m_public3;
private:
int m_private3;
protected:
int m_protected3;
};
D3 klassi o'z a'zolariga erkin kirishi mumkin. D3 D2 ning m_public2 va m_protected2 a'zolariga kirishi mumkin, lekin m_private2 emas. D3 D2 ni public ko’rinishida meros qilib olganligi sababli, m_public2 va m_protected2 o'zlarining kirish spetsifikatsiyalarini saqlab qoladilar va D3 orqali kirishda public va protected bo'lib qoladilar. D3 m_private sinfi Parentga kirish huquqiga ega emas. Shuningdek, u ajdod-sinfining m_protected yoki m_public-ga kirish huquqiga ega emas, D2 ularni meros qilib olgandan keyin ikkalasi ham private bo'lib qoldi.
Xulosa. Kirish spetsifikatsiyalari, meros turlari va avlod sinflarining o'zaro ta'siri chalkash bo'lishi mumkin. Buni tuzatish uchun keling, yana hamma narsani aniqlab olaylik:
Birinchidan, sinf har doim o'zining meros bo'lmagan a'zolariga kirish huquqiga ega (va do'stona sinflar ham kirish huquqiga ega). Kirish ko'rsatkichlari faqat sinfdan tashqaridagi obyektlar va avlod sinflari ushbu a'zolarga kira olishiga ta'sir qiladi.
Ikkinchidan, agar avlod sinflari ajdod-sinflar a'zolarini meros qilib olsalar, ajdod-sinf a'zolari o'zlarining kirish spesifikaturalarini avlod sinfidagi o'zgartirishlari mumkin. Bu hech qanday tarzda avlod sinflarining lokal (meros bo'lmagan) a'zolariga ta'sir qilmaydi (ular avlod sinfida aniqlanadi va o'z kirish spetsifikatsiyalariga ega). Bu faqat tashqi obyektlar va bizning avlod sinfimizning avlodlari bo'lgan sinflar ajdod-sinfning meros qilib olingan a'zolariga kira olishiga ta'sir qiladi.
Kirish spetsifikatsiyalari va meros turlarining umumiy jadvali:
Do'stlaringiz bilan baham: |