الوراثة المفردة والمتعددة
نمذج علاقات is-a باستخدام الوراثة المفردة، وتجنّب مشكلات الوراثة المتعددة.
الوراثة المفردة والمتعددة درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
ما الوراثة؟
تتيح الوراثة لفئة (الفئة المشتقة) إعادة استخدام فئة أخرى (الفئة الأساسية) وتوسيعها. وهي تمثّل علاقات «هو نوع من».
class Animal {
public:
void breathe() { std::cout << "breathing\n"; }
};
class Dog : public Animal {
public:
void bark() { std::cout << "Woof!\n"; }
};الوراثة العامة
استخدم public لتمثيل علاقة «هو نوع من» — فالكلب حيوان. وتحافظ الأعضاء على مستوى الوصول نفسه في الفئة المشتقة.
الوراثة المحمية والخاصة
تمثّل الوراثة باستخدام protected وprivate علاقة «يُنفَّذ باستخدام» — وهي نادرًا ما تُستخدم. فَضِّل التركيب في هذه الحالات.
الوصول إلى أعضاء الفئة الأساسية
يمكن للفئة المشتقة استخدام أي عضو عام أو محمي في الفئة الأساسية مباشرةً.
Dog d;
d.breathe(); // inherited from Animal
d.bark(); // own memberترتيب البُناة
يُنفَّذ بُناة الفئة الأساسية قبل بُناة الفئة المشتقة. استخدم قائمة تهيئة الأعضاء لتمرير الوسائط إلى الفئة الأساسية.
class Pet : public Animal {
std::string name_;
public:
Pet(std::string n) : Animal(), name_(std::move(n)) {}
};ترتيب المُهدِمات
تُنفَّذ المُهدِمات بترتيب عكسي — أولًا مُهدِم الفئة المشتقة ثم مُهدِم الفئة الأساسية. اجعل مُهدِم الفئة الأساسية virtual إذا كنت تحذف عبر مؤشّر إلى الفئة الأساسية.
الوراثة المتعددة
تسمح C++ لفئة بأن ترث من أكثر من فئة أساسية واحدة. استخدم ذلك باعتدال، لأنه يعقّد التصميم.
class Printable { public: virtual void print() = 0; };
class Serializable { public: virtual std::string serialize() = 0; };
class Document : public Printable, public Serializable {
// implements both interfaces
};مشكلة الماسة
إذا اشتركت فئتان أساسيتان في فئة أساسية مشتركة، تنتهي الفئة المشتقة بامتلاك نسختين من تلك الفئة الأساسية. عالج ذلك باستخدام الوراثة الافتراضية.
class A {};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {}; // D has ONE A, not twoتكلفة الوراثة الافتراضية
تضيف الفئات الأساسية الافتراضية تكلفة إضافية — مؤشّرًا إضافيًا لكل كائن، وإحالة إضافية عند كل وصول إلى عضو في الفئة الأساسية. تجنّبها متى أمكن.
التركيب أم الوراثة
غالبًا ما يكون التركيب القائم على علاقة «يمتلك» أبسط من الوراثة القائمة على علاقة «هو نوع من». فالسيارة Car تمتلك محرّكًا Engine — فلا تجعل Car ترث من Engine.
class Engine { /* ... */ };
class Car {
Engine engine_; // composition
};وراثة الواجهة أم وراثة التنفيذ
لها استخدامان شائعان:
- الواجهة — الاشتقاق من فئة أساسية ذات دوال افتراضية محضة لتنفيذ عقد
- التنفيذ — الاشتقاق لإعادة استخدام الشيفرة (CRTP وmixins)
متى تُستخدم الوراثة
استخدم الوراثة عندما:
- توجد علاقة حقيقية من نوع «هو نوع من»
- تحتاج إلى تعدد الأشكال وقت التشغيل عبر الدوال الافتراضية
- تكون الفئة الأساسية مصممة للوراثة
تحقق سريع
ما التقنية التي تمنع وجود نسختين من فئة أساسية مشتركة عند استخدام الوراثة المتعددة؟
مراجعة
تمثّل الوراثة علاقات «هو نوع من» باستخدام الوراثة العامة. وتُسمح الوراثة المتعددة، لكن مشكلة الماسة تتطلب الوراثة الافتراضية. فَضِّل التركيب لعلاقات «يمتلك»، ولإعادة استخدام الشيفرة.
الأسئلة الشائعة
هل درس «الوراثة المفردة والمتعددة» مجاني؟
نعم — نص درس «الوراثة المفردة والمتعددة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «الوراثة المفردة والمتعددة»؟
نمذج علاقات is-a باستخدام الوراثة المفردة، وتجنّب مشكلات الوراثة المتعددة. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الوراثة المفردة والمتعددة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الوراثة المفردة والمتعددة
- الدوال الافتراضية وvtable
- الأصناف المجرّدة والطرائق الافتراضية الخالصة
- المفاضلة بين الوراثة والتركيب