اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

التجريد ( Abstraction ) هو أسلوب مهم جداً يستخدم لتسهيل كتابة الأوامر على المبرمجين, فهو يجعلك قادراً على تنفيذ ما تريد دون الحاجة إلى معرفة كافة التفاصيل التي تم فيها تنفيذ ذلك.

والان بعد ان قمنا بتعريفه ما هو دعنا نتحدث عن شروطه :

 

  • الكلاس الذي يحتوي على دوال مجردة لا يمكن إنشاء كائنات منه لأنه في حال استدعاء الدالة لم يتم تعريفها منه فإن هذا سيسبب مشكلة.
  • الكلاس الذي يرث دوال مجردة و لا يقوم بإعادة كتابة محتواها أيضاً لا يمكن إنشاء كائنات منه لذات السبب.
  • الدوال الثابتة التي نوعها static لا يمكن تعريفها كدوال مجردة لأنها أصلاً تستخدم من الكلاس الأساسي.
  • أسلوب التجريد يتطلب استخدام الكلمتين virtual و override اللتين تم إضافتهما ابتداءاً من الإصدار C++ 11 لهذا تأكد أنك تستخدم هذا الإصدار أو الإصدارات الأحدث حتى تستطيع تطبيقه.

دعنا الان نأخد مثال عن طريقة عمله :

#include <iostream>

using namespace std;

// func يحتوي على دالة مجردة إسمها Base هنا قمنا بتعريف كلاس إسمه
class Base
{
    public:
        virtual void func() = 0;
};

// func و فيه قمنا بتعريف الدالة المجردة Base يرث من الكلاس Derived هنا قمنا بتعريف محتوى الكلاس
class Derived : public Base
{
    public:
        void func() override
        {
            cout << "Derived class overridden behaviour \n";
        }
};

// main() هنا قمنا بتعريف الدالة
int main()
{
    // d إسمه Derived هنا قمنا بإنشاء كائن من الكلاس
    Derived d;

    // Derived و التي تم تعريفها في الكلاس d من الكائن func() هنا قمنا باستدعاء الدالة
    d.func();

    return 0;
}
  • في هذا المثال قمنا بتعريف كلاس إسمه Base يحتوي على دالة مجردة إسمها func.
  • بعدها قمنا بتعريف كلاس إسمه Derived يرث من الكلاس Base و قمنا فيه بإعادة تعريف الدالة func.
  • في الأخير قمنا بإنشاء كائن من الكلاس Derived و من ثم استدعاء الدالة func() الموجودة فيه.

بعد تطبيق الكود وتشغيله ستحصل على النتيجة التالية :

اقتباس

Derived class overridden behaviour

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

انظر هنا قمت بتعديل هذان السطران من الكود 

  Derived d;
  d.func();

ليصبحو هكذا 

  Base b;  
  b.func();

وهذا هو الكود النهائي بعد التعديلات

#include <iostream>

using namespace std;

// func يحتوي على دالة مجردة إسمها Base هنا قمنا بتعريف كلاس إسمه
class Base
{
    public:
        virtual void func() = 0;
};

// func و فيه قمنا بتعريف الدالة المجردة Base يرث من الكلاس Derived هنا قمنا بتعريف محتوى الكلاس
class Derived : public Base
{
    public:
        void func() override
        {
            cout << "Derived class overridden behaviour \n";
        }
};

// main() هنا قمنا بتعريف الدالة
int main()
{
    // b إسمه Base هنا قمنا بإنشاء كائن من الكلاس
    Base b; // هذا السطر الذي قمت بتعديلها

    // Base و التي تم تعريفها في الكلاس b من الكائن func() هنا قمنا باستدعاء الدالة
    b.func(); // وهذا السطر ايضا

    return 0;
}

سنحصل على النتيجة التالية عند التشغيل.

error: cannot declare variable 'b' to be of abstract type 'Base'
    because the following virtual functions are pure within 'Base':
        'virtual void Base::func()'

لاحظ أن الخطأ فعلياً حدث بسبب هذه السطر 

Base b;

حيث أن المترجم قال بأنه لا يمكن إنشاء كائن من الكلاس Base لأنه يحتوي على دالة مجردة ( Pure Virtual Function ) ثم كتب لنا إسم الدالة المجردة أيضاً.

ارجو ان يكون تم توضيح الفكرة بالتفصيل 

بالتوفيق لك

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...