در ++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 پایه در مشتق |
---|---|---|
public | public | protected |
protected | protected | protected |
private | private | private |
اعضای 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» بهخوبی حفظ بشه.