C++ Inheritance Access

در ++C وقتی از Inheritance (وراثت) استفاده می‌کنیم، سه سطح مهم برای کنترل دسترسی اعضای کلاس پایه داریم:
public، protected و private.
همچنین هنگام ارث‌بری می‌تونیم نوع ارث‌بری رو هم مشخص کنیم. این دو عامل با هم تعیین می‌کنن که اعضای کلاس پایه در کلاس مشتق چه سطح دسترسی داشته باشن.

🔹 سطوح دسترسی اعضای کلاس

در کلاس پایه (Base Class) هر عضو می‌تونه یکی از این سه حالت باشه:

سطح دسترسیتوضیح
publicهمه‌جا (داخل و بیرون از کلاس) قابل دسترسه.
protectedفقط در کلاس خودش و کلاس‌های مشتق قابل دسترسه.
privateفقط در داخل همون کلاس قابل دسترسه.

🔹 نوع ارث‌بری

هنگام تعریف کلاس مشتق، نوع ارث‌بری رو مشخص می‌کنیم:

class Derived : public Base { ... } class Derived : protected Base { ... } class Derived : private Base { ... }

این تعیین می‌کنه اعضای public و protected کلاس پایه، در کلاس مشتق چه سطحی پیدا کنن.

نوع ارث‌بری (در تعریف Derived)اعضای public پایه در مشتقاعضای protected پایه در مشتق
publicpublicprotected
protectedprotectedprotected
privateprivateprivate

اعضای private پایه هیچ‌وقت مستقیماً قابل دسترسی در کلاس مشتق نیستند.

🔹 مثال ساده

#include <iostream> using namespace std; class Base { public: int pubVar = 1; protected: int protVar = 2; private: int privVar = 3; }; // ارث‌بری عمومی class DerivedPublic : public Base { public: void show() { cout << pubVar << endl; // ✅ دسترسی داریم cout << protVar << endl; // ✅ دسترسی داریم // cout << privVar << endl; ❌ خطا } }; int main() { DerivedPublic d; cout << d.pubVar << endl; // ✅ قابل دسترس // cout << d.protVar; ❌ خطا return 0; }

📌 خروجی:

1 2 1

🔹 ارث‌بری Protected و Private

class DerivedProtected : protected Base {}; class DerivedPrivate : private Base {};
  • اگر از protected استفاده کنیم:

    • pubVar و protVar داخل DerivedProtected قابل دسترس هستن، ولی برای بیرون از کلاس، دیگه public نیستن.

  • اگر از private استفاده کنیم:

    • هر دو pubVar و protVar در کلاس DerivedPrivate خصوصی میشن و بیرون از کلاس در دسترس نیستن.

🔹 توارث چند سطحی

class SubDerived : public DerivedProtected { public: void test() { // pubVar ? ✅ هنوز protected باقی مونده // protVar ? ✅ قابل دسترس } };

چون DerivedProtected به صورت protected از Base ارث‌بری کرده،
در SubDerived هم این اعضا همچنان protected باقی می‌مونن.

خلاصه نکات

  • private base members هرگز در کلاس مشتق قابل دسترسی نیستند.

  • نوع ارث‌بری تعیین می‌کنه اعضای public/protected پایه، چه سطحی در مشتق داشته باشن.

  • برای اکثر سناریوهای شی‌ءگرا از public inheritance استفاده کنید تا رابطه‌ی «is-a» به‌خوبی حفظ بشه.