الميراث في C++
الميراث هو مفهوم أساسي في OOP (البرمجة الشيئية) . إنها الآلية التي يُسمح من خلالها لفئة واحدة أن ترث ميزات (حقول وأساليب) لفئة أخرى. الميراث يعني إنشاء فئات جديدة بناءً على الفئات الموجودة. يمكن للفئة التي ترث من فئة أخرى إعادة استخدام أساليب وحقول تلك الفئة.
مثال: في المثال التالي، الحيوان هو الفئة الأساسية، والكلب والقطط والبقرة هما فئتان مشتقتان تعملان على توسيع فئة الحيوان.
Inheritance 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 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. الميراث الهجين
عندما يتم دمج نوعين أو أكثر من أنواع الميراث في برنامج واحد. على سبيل المثال، قد يستخدم الفصل الوراثة المتعددة ويكون أيضًا جزءًا من سلسلة الوراثة متعددة المستويات.
Hybrid 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++
- اقتران ضيق: تصبح الفئة الفرعية معتمدة على الفئة الأصل. أي تغيير في الفئة الأساسية قد يفرض تغييرات في الفئات المشتقة.
- انخفاض المرونة : في بعض الأحيان يتم إساءة استخدام الميراث حيث يؤدي التكوين (العلاقة) إلى كود أقل مرونة.
- زيادة التعقيد : يمكن للتسلسلات الهرمية للوراثة العميقة (متعددة المستويات أو الهجينة) أن تجعل من الصعب فهم التعليمات البرمجية وصيانتها وتصحيح أخطائها.
- مشكلة الماس: مع الهجين أو الميراث المتعدد، يمكن أن يحدث غموض إذا تم توريث نفس الفئة الأساسية عدة مرات.
- النفقات العامة للوظائف الافتراضية: إذا تم استخدام تعدد الأشكال (الوظائف الافتراضية)، فسيكون هناك وقت تشغيل صغير بسبب عمليات البحث في الجدول الافتراضي.