English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تعليمية C++ الأساسية

تحكم في عملية C++

وظائف مخصصة في C++

مجموعات بيانات C++ و سلاسل

هياكل بيانات C++

كلاس C++ و كائن

ال

الوراثة في C++

تعليمية STL C++

دليل مرجعي C++

توريث متعدد الطبقات و متعدد الطبقات و الشبكة في C++

في هذا المقال، ستتعلم أنماط التوريث المختلفة في برمجة C++: التوريث المتعدد مع أمثلة، التوريث متعدد الطبقات والشبكة.

التوريثوهو واحد من وظائف نواة لغات البرمجة المتجهة. يسمح للمطورين البرمجيين بتوليد فئة جديدة من فئة موجودة. تورث الفئة المورثة وظائف الفئة الأساسية (الفئة الموجودة).

هناك أنماط متعددة من التوريث في برمجة C++.

توريث متعدد الطبقات في C++

في برمجة C++، يمكن ليس فقط توريث فئة من الفئة الأساسية، بل يمكن أيضًا توريث فئة من فئة مورثة. هذا النوع من التوريث يُسمى التوريث متعدد الطبقات.

class A
{ 
... .. ... 
};
class B: public A
{
... .. ...
};
class C: public B
{
... ... ...
};

في هذا السياق، فئة B مورثة من الفئة الأساسية A، وفئة C مورثة من فئة B المورثة.

مثال 1: توريث متعدد الطبقات في C++

#include <iostream>
using namespace std;
class A
{
    public:
      void display()
      {
          cout << "محتويات الفئة الأساسية.";
      {}
};
class B : public A
{
};
class C : public B
{
 
};
int main()
{
    C obj;
    obj.display();
    return 0;
{}

نتيجة الإخراج

محتويات الفئة الأساسية.

في هذا البرنامج، فئة C مورثة من فئة B (فئة B مورثة من الفئة الأساسية A).

تم تعريف obj من فئة C في دالة main().

عند استدعاء دالة display()، سيتم تنفيذ دالة display() في فئة A. هذا لأن لا توجد دالة display() في فئة C و B.

المحول أولاً يبحث في فئة C عن دالة display(). لأن هذه الدالة غير موجودة في هذه الفئة، سيبحث في فئة B عن هذه الدالة ( لأن فئة C مورثة من فئة B).

لا توجد هذه الوظيفة display() في فئة B أيضًا، لذا سيبحث الماكينوم عنها في فئة A [بسبب B تنحدر من A).

إذا كانت هناك وظيفة display() في C، فإن الماكينوم سيغطي display() في فئة A (بسببمغطية وظائف الأعضاء))

إرث متعدد في C++

في برمجة C++، يمكن للفئة أن تنشأ من عدة فئات آباء. على سبيل المثال: الفئة Bat تنشأ من الفئات الأساسية Mammal و WingedAnimal. هذا له معنى لأن الشبح هو ثديي ويملك أجنحة.

مثال 2: الإرث المتعدد في برمجة C++

#include <iostream>
using namespace std;
class Mammal {
  public:
    Mammal()
    {
      cout << "يمكن للثدييات أن تنجب بشكل مباشر." << endl;
    {}
};
class WingedAnimal {
  public:
    WingedAnimal()
    {
      cout << "يمكن للحيوانات المأخوذة بالأجنحة ضرب أجنحتها." << endl;
    {}
};
class Bat: public Mammal, public WingedAnimal {
};
int main()
{
    Bat b1;
    return 0;
{}

نتيجة الإخراج

يمكن للثدييات أن تنجب بشكل مباشر.
يمكن للحيوانات المأخوذة بالأجنحة ضرب أجنحتها.

التباين في الوراثة المتعددة

أحد المشاكل الأكثر وضوحًا في الإرث المتعدد يحدث أثناء تعديل الوظائف.

افترض أن لدينا فئتين أساسيتين لديهما نفس الوظيفة، لكن لم يتم تعديل هذه الوظيفة في الفئة الفرعية.

إذا حاول استخدام كائن من الفئة الفرعية استدعاء هذه الوظيفة، فإن الماكينوم سيظهر خطأ. هذا لأن الماكينوم لا يعرف أي وظيفة يجب استدعاؤها. على سبيل المثال،

class base1
{
  public:
     void someFunction( )
     { .... ... .... }  
};
class base2
{
    void someFunction( )
     { .... ... .... } 
};
class derived : public base1, public base2
{
    
};
int main()
{
    derived obj;
    obj.someFunction() // خطأ!  
{}

يمكن حل هذه المشكلة باستخدام دالة نطاق الحالة لتعيين أي وظيفة تنتمي إلى فئة base1 أو base2

int main()
{
    obj.base1::someFunction( );  // استدعاء وظيفة فئة base1
    obj.base2::someFunction();   // استدعاء وظيفة فئة base2
{}

إرث هرمي في C++

إذا تم الإرث من أكثر من فئة من الفئة الأساسية، فيُسمى الإرث الهرمي. في الإرث الهرمي، جميع الوظائف المشتركة في الفئات الفرعية تشمل في الفئة الأساسية.

مثال: الفيزياء، الكيمياء، علم الأحياء جميعها تأتي من دروس العلوم.

النصغة في الوراثة المتعددة

class base_class {
     ... .. ...
{}
class first_derived_class: public base_class {
     ... .. ...
{}
class second_derived_class: public base_class {
     ... .. ...
{}
class third_derived_class: public base_class {
     ... .. ...
{}