الميراث في C++

الميراث في C++

الميراث هو مفهوم أساسي في OOP (البرمجة الشيئية) . إنها الآلية التي يُسمح من خلالها لفئة واحدة أن ترث ميزات (حقول وأساليب) لفئة أخرى. الميراث يعني إنشاء فئات جديدة بناءً على الفئات الموجودة. يمكن للفئة التي ترث من فئة أخرى إعادة استخدام أساليب وحقول تلك الفئة.

مثال: في المثال التالي، الحيوان هو الفئة الأساسية، والكلب والقطط والبقرة هما فئتان مشتقتان تعملان على توسيع فئة الحيوان.

Animal_classInheritance C++
   #include          using     namespace     std  ;   class     Animal   {      public  :      void     sound  ()      {      cout      < <     'Animal makes a sound'      < <     endl  ;      }   };   class     Dog     :     public     Animal   {      public  :      void     sound  ()      {      cout      < <     'Dog barks'      < <     endl  ;      }   };   class     Cat     :     public     Animal   {      public  :      void     sound  ()      {      cout      < <     'Cat meows'      < <     endl  ;      }   };   class     Cow     :     public     Animal   {      public  :      void     sound  ()      {      cout      < <     'Cow moos'      < <     endl  ;      }   };   int     main  ()   {      Dog     d  ;      d  .  sound  ();      Cat     c  ;      c  .  sound  ();      Cow     cow  ;      cow  .  sound  ();      return     0  ;   }   

الإخراج
Dog barks Cat meows Cow moos  

توضيح:

  • الحيوان هو الفئة الأساسية مع وظيفة الصوت ().
  • Dog Cat و Cow عبارة عن فئتين مشتقتين تحدد كل منهما طريقة الصوت () الخاصة بها.
  • في main() يتم إنشاء كائنات Dog Cat وCow بشكل منفصل.
  • عندما نستدعي الصوت () على كل كائن، يتم تشغيل طريقة الفئة الفرعية المعنية (Dog barks Cat meows Cow moos).

بناء الجملة

C++
   class     ChildClass     :     public     ParentClass   {      // Additional fields and methods   };   

كيف يعمل الوراثة في C++؟

القولون (:) مع محدد الوصول يستخدم للميراث في C++. يسمح للفئة المشتقة (الفئة الفرعية) بوراثة أعضاء البيانات (الحقول) ووظائف الأعضاء (الطرق) للفئة الأساسية (الفئة الأصلية).
عندما ترث فئة ما فئة أخرى، فإنها تحصل على جميع الأعضاء الذين يمكن الوصول إليهم من الفئة الأصلية ويمكن للفئة الفرعية أيضًا إعادة تعريف (تجاوز) أو إضافة وظائف جديدة إليهم.

أنواع الوراثة في لغة C++

الميراث

فيما يلي أنواع الميراث المختلفة التي يدعمها C++.

1. الميراث الواحد

في الميراث الفردي يتم اشتقاق فئة فرعية من فئة فائقة واحدة فقط. إنه يرث خصائص وسلوك فئة ذات والد واحد. في بعض الأحيان يُعرف أيضًا باسم الميراث البسيط.

الميراثSingle Inheritance C++
   #include          using     namespace     std  ;   class     Vehicle     {   public  :      Vehicle  ()     {      cout      < <     'This is a Vehicle'      < <     endl  ;      }   };   class     Car     :     public     Vehicle     {   public  :      Car  ()     {      cout      < <     'This Vehicle is Car'      < <     endl  ;      }   };   int     main  ()     {          Car     obj  ;      return     0  ;   }   

الإخراج
This is a Vehicle This Vehicle is Car  

2. الميراث المتعدد

في تعدد الميراث يمكن أن تحتوي فئة واحدة على أكثر من فئة فائقة واحدة وترث الميزات من جميع الفئات الأصلية.

الوراثة المتعددةMultiple Inheritance C++
   #include          using     namespace     std  ;   class     LandVehicle   {      public  :      void     landInfo  ()      {      cout      < <     'This is a LandVehicle'      < <     endl  ;      }   };   class     WaterVehicle   {      public  :      void     waterInfo  ()      {      cout      < <     'This is a WaterVehicle'      < <     endl  ;      }   };   // Derived class inheriting from both base classes   class     AmphibiousVehicle     :     public     LandVehicle       public     WaterVehicle   {      public  :      AmphibiousVehicle  ()      {      cout      < <     'This is an AmphibiousVehicle'      < <     endl  ;      }   };   int     main  ()   {      AmphibiousVehicle     obj  ;      obj  .  waterInfo  ();      obj  .  landInfo  ();      return     0  ;   }   

الإخراج
This is an AmphibiousVehicle This is a WaterVehicle This is a LandVehicle  

3. الميراث متعدد المستويات

الوراثة متعددة المستويات في لغة C++ تعني أن الفصل مشتق من فئة مشتقة أخرى تشكل سلسلة من الوراثة.

متعدد المستويات_الميراثMultilevel Inheritance C++
   #include          using     namespace     std  ;   class     Vehicle   {      public  :      Vehicle  ()      {      cout      < <     'This is a Vehicle'      < <     endl  ;      }   };   // Derived class from Vehicle   class     FourWheeler     :     public     Vehicle   {      public  :      FourWheeler  ()      {      cout      < <     '4 Wheeler Vehicles'      < <     endl  ;      }   };   // Derived class from FourWheeler   class     Car     :     public     FourWheeler   {      public  :      Car  ()      {      cout      < <     'This 4 Wheeler Vehicle is a Car'      < <     endl  ;      }   };   int     main  ()   {      Car     obj  ;      return     0  ;   }   

الإخراج
This is a Vehicle 4 Wheeler Vehicles This 4 Wheeler Vehicle is a Car  

4. الميراث الهرمي

في الميراث الهرمي، يتم توريث أكثر من فئة فرعية من فئة أساسية واحدة. أي أنه يتم إنشاء أكثر من فئة مشتقة من فئة أساسية واحدة. على سبيل المثال، السيارات والحافلات كلاهما مركبة.

hierarchical_inheritanceHierarchical Inheritance C++
   #include          using     namespace     std  ;   class     Vehicle   {      public  :      Vehicle  ()      {      cout      < <     'This is a Vehicle'      < <     endl  ;      }   };   class     Car     :     public     Vehicle   {      public  :      Car  ()      {      cout      < <     'This Vehicle is Car'      < <     endl  ;      }   };   class     Bus     :     public     Vehicle   {      public  :      Bus  ()      {      cout      < <     'This Vehicle is Bus'      < <     endl  ;      }   };   int     main  ()   {      Car     obj1  ;      Bus     obj2  ;      return     0  ;   }   

الإخراج
This is a Vehicle This Vehicle is Car This is a Vehicle This Vehicle is Bus  

5. الميراث الهجين

عندما يتم دمج نوعين أو أكثر من أنواع الميراث في برنامج واحد. على سبيل المثال، قد يستخدم الفصل الوراثة المتعددة ويكون أيضًا جزءًا من سلسلة الوراثة متعددة المستويات.

hybridInheritanceHybrid Inheritance C++
   #include          using     namespace     std  ;   class     Vehicle   {      public  :      Vehicle  ()      {      cout      < <     'This is a Vehicle'      < <     endl  ;      }   };   class     Fare   {      public  :      Fare  ()      {      cout      < <     'Fare of Vehicle'      < <     endl  ;      }   };   class     Car     :     public     Vehicle   {      public  :      Car  ()      {      cout      < <     'This Vehical is a Car'      < <     endl  ;      }   };   class     Bus     :     public     Vehicle       public     Fare   {      public  :      Bus  ()      {      cout      < <     'This Vehicle is a Bus with Fare'  ;      }   };   int     main  ()   {      Bus     obj2  ;      return     0  ;   }   

الإخراج
This is a Vehicle Fare of Vehicle This Vehicle is a Bus with Fare 

الميراث الهجين يمكن أن يؤدي إلى مشكلة الماس في سي ++. يحدث هذا عندما يرث الفصل من فئتين يشتركان في نفس الفئة الأساسية. ونتيجة لذلك، تحصل الفئة المشتقة على نسخ متعددة من أعضاء الفئة الأساسية مما يخلق غموضًا حول أي منها سيتم استخدامه.

ملحوظة : الحل هو استخدام الميراث الظاهري بحيث تتم مشاركة نسخة واحدة فقط من الفئة الأساسية.

مزايا الميراث في C++

  • إمكانية إعادة استخدام الكود : يمكن للفئة المشتقة إعادة استخدام أعضاء البيانات وأساليب فئتها الأساسية مباشرة مع تجنب تكرار التعليمات البرمجية.
  • التجريد : يدعم الفئات المجردة (الفئات ذات الوظائف الافتراضية الخالصة) التي تحدد واجهة مشتركة تفرض التجريد.
  • التسلسل الهرمي للفئة : يمكنك بناء تسلسلات هرمية (أساسية → مشتقة → مشتقة أكثر) لنموذج العلاقات في العالم الحقيقي.
  • تعدد الأشكال : يدعم بشكل كامل تعدد الأشكال في وقت التشغيل من خلال الوظائف الافتراضية وأيضًا تعدد الأشكال في وقت الترجمة من خلال التحميل الزائد للوظائف والقوالب.

مساوئ الميراث في C++

  • اقتران ضيق: تصبح الفئة الفرعية معتمدة على الفئة الأصل. أي تغيير في الفئة الأساسية قد يفرض تغييرات في الفئات المشتقة.
  • انخفاض المرونة : في بعض الأحيان يتم إساءة استخدام الميراث حيث يؤدي التكوين (العلاقة) إلى كود أقل مرونة.
  • زيادة التعقيد : يمكن للتسلسلات الهرمية للوراثة العميقة (متعددة المستويات أو الهجينة) أن تجعل من الصعب فهم التعليمات البرمجية وصيانتها وتصحيح أخطائها.
  • مشكلة الماس: مع الهجين أو الميراث المتعدد، يمكن أن يحدث غموض إذا تم توريث نفس الفئة الأساسية عدة مرات.
  • النفقات العامة للوظائف الافتراضية: إذا تم استخدام تعدد الأشكال (الوظائف الافتراضية)، فسيكون هناك وقت تشغيل صغير بسبب عمليات البحث في الجدول الافتراضي.
إنشاء اختبار