




السمعة:
- إنضم2 سبتمبر 2023
- المشاركات 140
- مستوى التفاعل 244
- النقاط 43
بسم الله الرحمن الرحيم
سوف نتحدث اليوم في هذا الدرس عن مفهوم الوراثة (Inheritance) والتي تعد من أهم المفاهيم التي تسمح للمطورين بإنشاء هيكلية للبرامج والتي بدورها تعتمد على العلاقات بين الكائنات
سيتم الشرح بشكل مبسط لمفهوم وأنواع الوراثة بإذن الله فالنبدأ

في البداية ماذا تعني كلمة الوراثة (Inheritance) ؟

إذاً فالفكرة من الوراثة أنه إذا كنت تريد إنشاء كلاس جديد و لاحظت أنه يوجد كلاس جاهز يحتوي على كودات قد تفيدك يمكنك استغلالها بكل بساطة بدلاً من كتابتها من الصفر, أي يمكنك جعل الكلاس الذي قمت بتعريفه يرث هذا الكلاس, و بعدها يمكنك إستخدام جميع المتغيرات و الدوال التي ورثها الكلاس الجديد من الكلاس الجاهز
سنتحدث الأن عن مصطلحات لابد من معرفتها قبل البدء وهي =>


يوجد أشكال للوراثة في لغة ال ++ C وهي أربع أشكال
الشكل الأول

الشكل الثاني

الشكل الثالث

الشكل الرابع

صورة لتوضيح أشكال الوراثة
والأن لجعل كلاس يرث من كلاس أخر نتبع الأسلوب التالي
كود:
class derived-class : access-specifier base-class
{
}
base-class: يقصد بها إسم الكلاس الأب
access-specifier: يقصد بها تحديد كيف يمكن الوصول للأشياء التي تم تضمينها في الكلاس الأب في الكلاس الإبن
إذاً لجعل الكلاس يرث من كلاس آخر نضع بعد إسم الكلاس نقطتين فوق بعض, ثم إسم الكلاس الذي نريده أن يرث منه و
مكان الكلمة access-specifier يمكنك وضع public أو private أو protected أو عدم وضع أي كلمة منهم و بذلك سيتم إعتبار أنك وضعت الكلمة private
فعندما تجعل الكلاس يرث من كلاس آخر يمكنك استخدام إحدى كلمات الوصول (Access Specifier ) لتحدد كيف يمكن الوصول للأشياء التي ورثها الكلاس الإبن من الكلاس الأب
حيث إن الكلمة public تستخدم لتحديد أن الأشياء التي سيرثها الكلاس الإبن من الكلاس الأب سيكون الوصول لها ممكناً من أي مكان
مثال: class B : public A
هنا أي شيء يرثه الكلاس B من الكلاس A سيتم إعتبار كأنه تم تعريفه public في الكلاس B
أما الكلمة private تستخدم لتحديد أن الأشياء التي سيرثها الكلاس الإبن من الكلاس الأب يمكن الوصول لها من نفس الكلاس فقط
مثال: class B : private A
هنا أي شيء يرثه الكلاس B من الكلاس A سيتم إعتبار كأنه تم تعريفه private في الكلاس B
وأخيراً الكلمة protected تستخدم لتحديد أن الأشياء التي سيرثها الكلاس الإبن من الكلاس الأب يمكن الوصول لها من نفس الكلاس و من أي كلاس آخر يرثها
مثال: class B : protected A
هنا أي شيء يرثه الكلاس B من الكلاس A سيتم إعتبار كأنه تم تعريفه protected في الكلاس B
أمثلة عن الوراثة
المثال الأول سيكون عن الوراثة الفردية
كود:
#include <iostream>
using namespace std;
// printMessage و دالة إسمها x يحتوي على متغير إسمه A هنا قمنا بتعريف كلاس إسمه
class A {
public:
int x = 10;
void printMessage()
{
cout << "Hello from class A \n";
}
};
// y و يحتوي على متغير إسمه A يرث من الكلاس B هنا قمنا بتعريف كلاس إسمه
class B: public A {
public:
int y = 20;
};
// main() هنا قمنا بتعريف الدالة
int main()
{
// b إسمه B هنا قمنا بإنشاء كائن من الكلاس
B b;
// B و الذي تم تعريفه في الكلاس b الموجود في الكائن y هنا قمنا بطباعة قيمة المتغير
cout << "y = " << b.y << "\n";
// A من الكلاس B و الذي ورثه الكلاس b الموجود في الكائن x هنا قمنا بطباعة قيمة المتغير
cout << "x = " << b.x << "\n";
// A من الكلاس B و التي ورثها الكلاس b الموجودة في الكائن printMessage() هنا قمنا باستدعاء الدالة
b.printMessage();
return 0;
}
بعدها قمنا بإنشاء كلاس إسمه B يحتوي على متغير إسمه y و يرث من الكلاس A
إذا فالكلاس B هو ال derived-class
والكلاس A هو ال base-class
سيكون ناتج الكود هو التالي :
كود:
y = 20
x = 10
Hello from class A
المثال الثاني عن الوراثة المُتتالية
كود:
#include <iostream>
using namespace std;
// printA يحتوي على دالة إسمها A هنا قمنا بتعريف كلاس إسمه
class A {
public:
void printA()
{
cout << "Hello from class A \n";
}
};
// printB و يحتوي على دالة إسمها A يرث من الكلاس B هنا قمنا بتعريف كلاس إسمه
class B: public A {
public:
void printB()
{
cout << "Hello from class B \n";
}
};
// printC و يحتوي على دالة إسمها B يرث من الكلاس C هنا قمنا بتعريف كلاس إسمه
class C: public B {
public:
void printC()
{
cout << "Hello from class C \n";
}
};
// main() هنا قمنا بتعريف الدالة
int main()
{
// c إسمه C هنا قمنا بإنشاء كائن من الكلاس
C c;
// c هنا قمنا باستدعاء جميع الدوال الموجودة في الكائن
c.printA();
c.printB();
c.printC();
return 0;
}
بعدها قمنا بإنشاء كلاس إسمهB يحتوي على دالة إسمها printB() و يرث من الكلاس A
بعدها قمنا بإنشاء كلاس إسمه C يحتوي على دالة إسمها printC() و يرث من الكلاس B
صورة لتوضيح مَن ورث مِن مَن
ناتج الكود
كود:
Hello from class A
Hello from class B
Hello from class C
كود:
#include <iostream>
using namespace std;
// printA يحتوي على دالة إسمها A هنا قمنا بتعريف كلاس إسمه
class A {
public:
void printA()
{
cout << "Hello from class A \n";
}
};
// printB يحتوي على دالة إسمها B هنا قمنا بتعريف كلاس إسمه
class B {
public:
void printB()
{
cout << "Hello from class B \n";
}
};
// printC و يحتوي على دالة إسمها B و يرث من الكلاس A يرث من الكلاس C هنا قمنا بتعريف كلاس إسمه
class C: public A, public B {
public:
void printC()
{
cout << "Hello from class C \n";
}
};
// main() هنا قمنا بتعريف الدالة
int main()
{
// c إسمه C هنا قمنا بإنشاء كائن من الكلاس
C c;
// c هنا قمنا باستدعاء جميع الدوال الموجودة في الكائن
c.printA();
c.printB();
c.printC();
return 0;
}
بعدها قمنا بإنشاء كلاس إسمه B يحتوي على دالة إسمها printB()
بعدها قمنا بإنشاء كلاس إسمه C يحتوي على دالة إسمها printC() و يرث من الكلاس A و الكلاس B
سنحصل على النتيجة التالية
كود:
Hello from class A
Hello from class B
Hello from class C
كود:
#include <iostream>
using namespace std;
// printA يحتوي على دالة إسمها A هنا قمنا بتعريف كلاس إسمه
class A {
public:
void printA()
{
cout << "Hello from class A \n";
}
};
// printB و يحتوي على دالة إسمها A يرث من الكلاس B هنا قمنا بتعريف كلاس إسمه
class B : public A {
public:
void printB()
{
cout << "Hello from class B \n";
}
};
// printC و يحتوي على دالة إسمها A يرث من الكلاس C هنا قمنا بتعريف كلاس إسمه
class C: public A {
public:
void printC()
{
cout << "Hello from class C \n";
}
};
// main() هنا قمنا بتعريف الدالة
int main()
{
// و استدعاء جميع الدوال الموجودة فيه b إسمه B هنا قمنا بإنشاء كائن من الكلاس
B b;
b.printA();
b.printB();
// و استدعاء جميع الدوال الموجودة فيه c إسمه C هنا قمنا بإنشاء كائن من الكلاس
C c;
c.printA();
c.printC();
return 0;
}
بعدها قمنا بإنشاء كلاس إسمهB يحتوي على دالة إسمها printB() و يرث من الكلاس A
بعدها قمنا بإنشاء كلاس إسمه C يحتوي على دالة إسمها printC() و يرث من الكلاس A أيضاً
الناتج
كود:
Hello from class A
Hello from class B
Hello from class A
Hello from class C
أما الوراثة الهرمية هو أن ال class يرثون من كلاس واحد
الوراثة المتعددة الوراثة الهرمية
يعطيكم العافية


دروس البرمجة الكائنية
التعديل الأخير بواسطة المشرف: