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

دليل الأساسيات C++

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

الوظائف في C++

مجموعات بيانات وروابط نصية C++

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

فئات وعدادات C++

المؤشرات في C++

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

دليل STL C++

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

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

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

الوراثة هي واحدة من الميزات الرئيسية للبرمجة الموجهة بالأدوار في C ++. تسمح للمستخدمين بإنشاء نوع جديد من الفئات (نوع فرعي) من فئة موجودة (نوع أساسي)نوع(نوع فرعي).

توريث النوع الفرعي جميع الوظائف من النوع الأساسي ويستطيع امتلاك وظائف خاصة به

لماذا نستخدم الوراثة؟

افترض أنك تحتاج في اللعبة إلى ثلاثة أدوار - دورمعلم رياضيات(Maths teacher),واحدلاعب كرة القدم (Footballer)والتاجر(Businessman).

بما أن جميع الأدوار هي أشخاص، يمكنهم المشي والتحدث. ولكن لديهم أيضًا مهارات خاصة بهم. يمكن للمعلم في الرياضياتتعليم الرياضيات، يمكن لللاعبين كرة القدملعب كرة القدم، يمكن للتجارإدارة الشركة.

يمكنك إنشاء ثلاث فئات يمكنها المشي، والتحدث، وإجراء مهارات خاصة بها، كما هو موضح في الشكل التالي.

في كل فئة، ستجد نفس الكود لـ Walk (المشي) وTalk (التحدث) لكل دور

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

إذا كان لديناPersonفئة، تحتوي على وظائف أساسية مثل التحدث، المشي، الأكل، النوم، وإضافة مهارات خاصة بناءً على دورنا، مما يجعل ذلكالكثير

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

لأنه، بالنسبة لمعلم الرياضيات (النوع الفرعي)، يمكنك استدعاء جميع الوظائف من Person (النوع الأساسي) وإضافة وظائف جديدةTeachMaths(تدريس الرياضيات). وبالمثل، بالنسبة للاعب كرة القدم، تورثت Person جميع الوظائف وأضفت وظائف جديدةPlayFootball(لعب كرة القدم) وما إلى ذلك.

هذا يجعل شيفرةك أكثر بساطة وسهولة في الفهم والإ扩ا.

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

تحقيق التوريث في برمجة C++

class Person 
{
  ... .. ...
};
class MathsTeacher : public Person 
{
  ... .. ...
};
class Footballer : public Person
{
  .... .. ...
};

في المثال السابق، Person هي الفئة الأساسية، بينما MathsTeacher و Footballer هما الفئات المورثة.

يظهر الفئات المورثة مع بيانات الفئة، متبوعة بنقطة عائمة، المفتاح public واسم الفئة التي يتم توريثها.

بما أن MathsTeacher و Footballer هما من يرثان من Person، يمكن الوصول إلى جميع بيانات الأعضاء ووظائف الأعضاء الخاصة بهما.

مثال: توريث في برمجة C++

استخدام مفهوم الاستنساخ لإنشاء شخصيات اللعبة.

#include <iostream>
using namespace std;
class Person
{
     public:
        string profession;
        int age;
        Person(): profession("unemployed"), age(16) { }
        void display()
        {
             cout << "مهنتى هي: " << profession << endl;
             cout << "عمرى هو: " << age << endl;
             walk();
             talk();
        }
        void walk() { cout << "أنا أتسير." << endl; }
        void talk() { cout << "أنا أتكلم." << endl; }
};
// MathsTeacher class inherits from base class Person.
class MathsTeacher : public Person
{
    public:
       void teachMaths() { cout << "أنا أدرس الرياضيات." << endl; }
};
// Footballer class inherits from base class Person.
class Footballer : public Person
{
    public:
       void playFootball() { cout << "أنا ألعب كرة القدم." << endl; }
};
int main()
{
     MathsTeacher teacher;
     teacher.profession = "老师";
     teacher.age = 23;
     teacher.display();
     teacher.teachMaths();
     Footballer footballer;
     footballer.profession = "运动员";
     footballer.age = 19;
     footballer.display();
     footballer.playFootball();
     return 0;
}

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

مهنتى هي: معلم
عمرى هو: 23
سأمشي
سأتكلم
سأدرس الرياضيات
مهنتى هي: لاعب
عمرى هو: 19
سأمشي
سأتكلم
سألعب كرة القدم.

في هذا البرنامج، Person هي الفئة الأساسية، بينما MathsTeacher وFootballer تمت إرثها من فئة Person.

فئة Person تحتوي على عضوين من البيانات - profession وage. كما تحتوي أيضًا على دوالين - walk() وtalk().

كلا MathsTeacher وFootballer يمكنهما الوصول إلى جميع أعضاء البيانات والأساليب الخاصة بـ Person.

لكن، MathsTeacher وFootballer يمتلكان أيضًا دوالًا مُحددة لهما: teachMaths() وplayFootball(). هذه الدوال يمكن الوصول إليها فقط من قبل الفئة الخاصة بها.

في دالة main()، تم إنشاء كائن جديد من نوع MathsTeacher teacher.

بسبب أنه يمكنه الوصول إلى أعضاء البيانات الخاصة بـ Person، يمكن تعيين profession (المهنة) وage (العمر) لـ teacher. يتم عرض هذه البيانات باستخدام دالة display() المحددة في فئة Person. وبالمثل، تم تعريف دالة teachingMaths() في فئة MathsTeacher.

بالمثل، سيتم إنشاء كائن جديد من نوع Footballer footballer. يمكنه الوصول إلى أعضاء البيانات الخاصة بـ Person، ويمكنه أيضًا عرض البيانات من خلال دالة display(). ثم يمكن الوصول إلى دالة playFootball() الموجودة فقط في كائن Footballer.

مُعرفات الوصول في الإرث

عند إنشاء فئة مُتفرعة من الفئة الأساسية، يمكن استخدام مُعرفات الوصول المختلفة للإرث من أعضاء البيانات للفئة الأساسية.

هذه يمكن أن تكون public،protected أو private.

في المثال أعلاه، تم وراثة الطبقة الأصلية Person بشكل عام من قبل MathsTeacher وfootball.

معرفة المزيد عنالوراثة العامة، الحماية والخاصة في C++لمعرفة المزيد.

تحميل الوظائف في الوراثة

إذا كانت وظائف الطبقة الأساسية والفرعية لها نفس الاسم والمعلمات.

إذا تم إنشاء جسم فرعي للطبقة الفرعية وتم محاولة الوصول إلى هذه الوظيفة، يمكن فقط استدعاء وظيفة الطبقة الفرعية.

سيقوم مبدأ الطبقة الفرعية بتحميل وظائف الطبقة الأساسية.

معرفة المزيد عنتحميل الوظائف في C++لمعرفة المزيد.