C++ ommaviy, himoyalangan va xususiy merosxo'rlik
C++ inheritance da biz turli xil kirish rejimlarida asosiy sinfdan class bolasini olishimiz mumkin. Masalan,
class Base {
.... ... ....
};
class Derived : public Base {
.... ... ....
};
Koddagi keyword public ga e'tibor bering
class Derived : public Base
Bu shuni anglatadiki, biz ommaviy rejimda asosiy sinfdan olingan sinf yaratdik. Shu bilan bir qatorda, biz himoyalangan yoki shaxsiy rejimlarda sinflarni ham olishimiz mumkin.
Ushbu 3 ta kalit so'z ( public , protected va private ) C++ merosida kirish spetsifikatorlari sifatida tanilgan.
public public tayanch sinfining a'zolariga aylanadi va asosiy sinfning protected a'zolari olingan sinfda protected bo'lib qoladi.public va protected ni olingan sinfdagi protected tayanch sinfining a'zolariga aylantiradi.public va protected ni olingan sinfdagi private tayanch sinfining a'zolariga aylantiradi.[!NOTE] Asosiy sinfning
privatea'zolari olingan sinf uchun mavjud emas.
class Base {
public:
int x;
protected:
int y;
private:
int z;
};
class PublicDerived: public Base {
// x ommaviydir
// y himoyalangan
// z-ga PublicDerived-dan kirish imkoni yo'q
};
class ProtectedDerived: protected Base {
// x himoyalangan
// y himoyalangan
// z-ga ProtectedDerived-dan kirish mumkin emas
};
class PrivateDerived: private Base {
// x shaxsiydir
// y shaxsiydir
// z-ga PrivateDerived-dan kirish imkoni yo'q
};
// Ommaviy merosning ishlashini ko'rsatish uchun C++ dasturi
#include <iostream>
using namespace std;
class Base {
private:
int pvt = 1;
protected:
int prot = 2;
public:
int pub = 3;
// shaxsiy a'zoga kirish funksiyasi
int getPVT() {
return pvt;
}
};
class PublicDerived : public Base {
public:
// Bazadan himoyalangan a'zoga kirish funksiyasi
int getProt() {
return prot;
}
};
int main() {
PublicDerived object1;
cout << "Private = " << object1.getPVT() << endl;
cout << "Protected = " << object1.getProt() << endl;
cout << "Public = " << object1.pub << endl;
return 0;
}
Chiqish
Private = 1
Protected = 2
Public = 3
Bu erda biz ommaviy rejimda PublicDerived ni Base dan oldik.
Natijada, PublicDerived da:
getPVT() ommaviy sifatida meros qilib olinadi.Base da shaxsiydir.main() orqali shaxsiy va himoyalangan aʼzolarga kirish imkoni boʻlmagani uchun ularga kirish uchun getPVT() va getProt() umumiy funksiyalarini yaratishimiz kerak:
// Xato: "Base::pvt" a'zosiga kirish imkonsiz
cout << "Private = " << object1.pvt;
// Xato: "Base::prot" a'zosiga kirish imkonsiz
cout << "Protected = " << object1.prot;
getPVT() funksiyasi Base ichida aniqlanganiga e'tibor bering. Ammo getProt() funksiyasi PublicDerived ichida aniqlangan.
Buning sababi, Base da xususiy bo'lgan pvt ga PublicDerived uchun kirish imkoni yo'q.
Biroq, umumiy meros tufayli prot PublicDerived ga kirish mumkin. Shunday qilib, getProt() himoyalangan oʻzgaruvchiga PublicDerived ichidan kirishi mumkin.
Accessibility private members protected members public members Base Class Yes Yes Yes Derived Class No Yes Yes
// Himoyalangan merosning ishlashini ko'rsatish uchun C++ dasturi
#include <iostream>
using namespace std;
class Base {
private:
int pvt = 1;
protected:
int prot = 2;
public:
int pub = 3;
// shaxsiy a'zoga kirish funksiyasi
int getPVT() {
return pvt;
}
};
class ProtectedDerived : protected Base {
public:
// Bazadan himoyalangan a'zoga kirish funksiyasi
int getProt() {
return prot;
}
// Base-dan umumiy a'zoga kirish funksiyasi
int getPub() {
return pub;
}
};
int main() {
ProtectedDerived object1;
cout << "Private cannot be accessed." << endl;
cout << "Protected = " << object1.getProt() << endl;
cout << "Public = " << object1.getPub() << endl;
return 0;
}
Chiqish
Private cannot be accessed.
Protected = 2
Public = 3
Bu erda biz himoyalangan rejimda Base dan ProtectedDerived ni oldik.
Natijada, ProtectedDerived da:
getPVT() himoyalangan sifatida meros qilib olinadi.
-pvt -ga kirish imkonsiz, chunki u Base -da shaxsiydir.Maʼlumki, himoyalangan aʼzolarga sinfdan tashqarida toʻgʻridan-toʻgʻri kirish mumkin emas. Natijada biz ProtectedDerived dan getPVT() dan foydalana olmaymiz.
Shuning uchun ham pub o'zgaruvchisiga kirish uchun ProtectedDerived da getPub() funksiyasini yaratishimiz kerak.
// Xato: "Base::getPVT()" a'zosiga kirish imkonsiz
cout << "Private = " << object1.getPVT();
// Xato: "Base::pub" a'zosiga kirish imkonsiz
cout << "Public = " << object1.pub;
Accessibility private members protected members public members Base Class Yes Yes Yes Derived Class No Yes Yes (inherited as protected variables)
// Shaxsiy merosning ishlashini ko'rsatish uchun C++ dasturi
#include <iostream>
using namespace std;
class Base {
private:
int pvt = 1;
protected:
int prot = 2;
public:
int pub = 3;
// shaxsiy a'zoga kirish funksiyasi
int getPVT() {
return pvt;
}
};
class PrivateDerived : private Base {
public:
// Bazadan himoyalangan a'zoga kirish funksiyasi
int getProt() {
return prot;
}
// shaxsiy a'zoga kirish funksiyasi
int getPub() {
return pub;
}
};
int main() {
PrivateDerived object1;
cout << "Private cannot be accessed." << endl;
cout << "Protected = " << object1.getProt() << endl;
cout << "Public = " << object1.getPub() << endl;
return 0;
}
Chiqish
Private cannot be accessed.
Protected = 2
Public = 3
Bu erda biz xususiy rejimda PrivateDerived -ni Base -dan oldik.
Natijada, PrivateDerived da:
pub va getPVT() shaxsiy sifatida meros qilib olinadi.Base da shaxsiydir.Ma'lumki, shaxsiy a'zolarga sinfdan tashqaridan to'g'ridan-to'g'ri kirish mumkin emas. Natijada biz PrivateDerived dan getPVT() dan foydalana olmaymiz.
Shuning uchun ham pub o'zgaruvchisiga kirish uchun PrivateDerived da getPub() funksiyasini yaratishimiz kerak.
// Xato: "Base::getPVT()" a'zosiga kirish imkonsiz
cout << "Private = " << object1.getPVT();
// Xato: "Base::pub" a'zosiga kirish imkonsiz
cout << "Public = " << object1.pub;
Accessibility private members protected members public members Base Class Yes Yes Yes Derived Class No Yes (inherited as private variables) Yes (inherited as private variables)