Programming Basics SQL HTML CSS JavaScript Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Learn Typing

C++فائدة الكلمتين override و virtual في الوراثة

إذا كنت تريد كتابة الكود بشكل يكون سهل التعامل معه و مراجعته لاحقاً فمن الأفضل إضافة الكلمة virtual لأي دالة تريد من الكلاس الذي يرثها أن يقوم بإعادة تعريفها حتى تتناسب معه, و في الكلاس الذي يرثها من الأفضل أيضاً أن تضيف الكلمة override للدالة التي تعيد تعريفها من جديد في الكلاس الإبن.

ملاحظة: تم إضافة هاتين الكلمتين إبتداءاً من الإصدار C++ 11 و الإصدارات اللاحقة.


في المثال التالي قمنا بتعريف كلاس إسمه Base يحتوي على دالة إسمها func و نوعها virtual void.
بعدها قمنا بتعريف كلاس إسمه Derived يرث من الكلاس Base و قمنا فيه بإعادة تعريف الدالة func مع إضافة الكلمة override عند تعريفها.

في الأخير قمنا بإنشاء كائن من الكلاس Derived و من ثم استدعاء الدالة func() الموجودة فيه.

مثال

main.cpp
#include <iostream>
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;
}
#include <iostream> 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 ).