C++فائدة الكلمتين override
و virtual
في الوراثة
إذا كنت تريد كتابة الكود بشكل يكون سهل التعامل معه و مراجعته لاحقاً فمن الأفضل إضافة الكلمة virtual
لأي دالة تريد من الكلاس الذي يرثها أن يقوم بإعادة تعريفها حتى تتناسب معه, و في الكلاس الذي يرثها من الأفضل أيضاً أن تضيف الكلمة override
للدالة التي تعيد تعريفها من جديد في الكلاس الإبن.
ملاحظة: تم إضافة هاتين الكلمتين إبتداءاً من الإصدار C++ 11 و الإصدارات اللاحقة.
في المثال التالي قمنا بتعريف كلاس إسمه Base
يحتوي على دالة إسمها func
و نوعها virtual void
.
بعدها قمنا بتعريف كلاس إسمه Derived
يرث من الكلاس Base
و قمنا فيه بإعادة تعريف الدالة func
مع إضافة الكلمة override
عند تعريفها.
في الأخير قمنا بإنشاء كائن من الكلاس Derived
و من ثم استدعاء الدالة func()
الموجودة فيه.
مثال
using namespace std; // func يحتوي على دالة واحدة إسمها Base هنا قمنا بتعريف كلاس إسمه class Base { public: virtual void func() { cout << "Base class default behavior \n"; } }; // أيضاً 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; }
سنحصل على النتيجة التالية عند التشغيل.
Derived class overridden behaviour
معلومة تقنية
في المثال السابق إذا قمت بإزالة الكلمتين virtual
و override
و لن يسبب ذلك أي مشكلة أو إختلاف لأنه كما سبق و قلنا أننا نضعهما فقط بهدف كتابة الكود بأسلوب متعارف عليه.
بالنسبة للمترجم, عند وضع الكلمة virtual
فإنك مخير على وضع الكلمة override
عند إعادة تعريف الدالة. و لكنه لا يسمح لك بوضع الكلمة override
إذا لم تكن الدالة في الأصل نوعها virtual
.
بالعودة للدرس ستتعلم المزيد حول فائدة الكلمة virtual
التي يمكن استخدامها لتحقيق مبدئ التجريد ( Abstraction ).