47 / 90

C++ Public, Protected & Private Inheritance

C++ ommaviy, himoyalangan va xususiy merosxo'rlik

C++ inheritance da biz turli xil kirish rejimlarida asosiy sinfdan class bolasini olishimiz mumkin. Masalan,

example.cpp
class Base {
.... ... ....
};

class Derived : public Base {
.... ... ....
};

Koddagi keyword public ga e'tibor bering

example.cpp
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.

C++ da umumiy, himoyalangan va xususiy meros

  • ommaviy meros olingan sinfda public public tayanch sinfining a'zolariga aylanadi va asosiy sinfning protected a'zolari olingan sinfda protected bo'lib qoladi.
  • himoyalangan meros public va protected ni olingan sinfdagi protected tayanch sinfining a'zolariga aylantiradi.
  • xususiy meros public va protected ni olingan sinfdagi private tayanch sinfining a'zolariga aylantiradi.

[!NOTE] Asosiy sinfning private a'zolari olingan sinf uchun mavjud emas.

example.cpp
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
};

1-misol: C++ umumiy meros

example.cpp
// 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

kod
Private = 1
Protected = 2
Public = 3

Bu erda biz ommaviy rejimda PublicDerived ni Base dan oldik.

Natijada, PublicDerived da:

  • prot himoyalangan holda meros qilib olinadi.
  • pub va getPVT() ommaviy sifatida meros qilib olinadi.
  • pvt kirish imkonsiz, chunki u 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:

example.cpp
// 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.

Ommaviy merosda foydalanish imkoniyati

Accessibility private members protected members public members Base Class Yes Yes Yes Derived Class No Yes Yes

2-misol: C++ himoyalangan meros

example.cpp
// 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

kod
Private cannot be accessed.
Protected = 2
Public = 3

Bu erda biz himoyalangan rejimda Base dan ProtectedDerived ni oldik.

Natijada, ProtectedDerived da:

  • prot, pub va 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.

example.cpp
// Xato: "Base::getPVT()" a'zosiga kirish imkonsiz
cout << "Private = " << object1.getPVT();

// Xato: "Base::pub" a'zosiga kirish imkonsiz
cout << "Public = " << object1.pub;

Himoyalangan merosda foydalanish imkoniyati

Accessibility private members protected members public members Base Class Yes Yes Yes Derived Class No Yes Yes (inherited as protected variables)

3-misol: C++ xususiy meros

example.cpp
// 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

kod
Private cannot be accessed.
Protected = 2
Public = 3

Bu erda biz xususiy rejimda PrivateDerived -ni Base -dan oldik.

Natijada, PrivateDerived da:

  • prot, pub va getPVT() shaxsiy sifatida meros qilib olinadi.
  • pvt kirish imkonsiz, chunki u 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.

example.cpp
// Xato: "Base::getPVT()" a'zosiga kirish imkonsiz
cout << "Private = " << object1.getPVT();

// Xato: "Base::pub" a'zosiga kirish imkonsiz
cout << "Public = " << object1.pub;

Shaxsiy merosda foydalanish imkoniyati

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)