- دالة C++ الافتراضية هي وظيفة عضو في الفئة الأساسية التي تقوم بإعادة تعريفها في فئة مشتقة. تم الإعلان عنه باستخدام الكلمة الأساسية الافتراضية.
- يتم استخدامه لإخبار المترجم بإجراء ربط ديناميكي أو ربط متأخر للوظيفة.
- هناك ضرورة لاستخدام مؤشر واحد للإشارة إلى كافة الكائنات من الفئات المختلفة. لذلك، نقوم بإنشاء المؤشر إلى الفئة الأساسية التي تشير إلى كافة الكائنات المشتقة. ولكن، عندما يحتوي مؤشر الفئة الأساسية على عنوان كائن الفئة المشتقة، فإنه ينفذ دائمًا وظيفة الفئة الأساسية. لا يمكن حل هذه المشكلة إلا باستخدام الوظيفة 'الافتراضية'.
- الكلمة 'الافتراضية' هي كلمة أساسية تسبق الإعلان العادي للوظيفة.
- عندما تصبح الوظيفة افتراضية، تحدد لغة C++ الوظيفة التي سيتم استدعاؤها في وقت التشغيل بناءً على نوع الكائن الذي يشير إليه مؤشر الفئة الأساسية.
الربط المتأخر أو الارتباط الديناميكي
في وقت متأخر يتم حل استدعاء وظيفة الربط أثناء وقت التشغيل. لذلك يحدد المترجم نوع الكائن في وقت التشغيل، ثم يربط استدعاء الوظيفة.
قواعد الوظيفة الافتراضية
روجيرا بانيرجي
- يجب أن تكون الوظائف الافتراضية أعضاءً في فئة معينة.
- لا يمكن أن تكون الوظائف الافتراضية أعضاءً ثابتين.
- يتم الوصول إليها من خلال مؤشرات الكائن.
- يمكن أن يكونوا أصدقاء لفئة أخرى.
- يجب تعريف الدالة الافتراضية في الفئة الأساسية، على الرغم من عدم استخدامها.
- يجب أن تكون النماذج الأولية للوظيفة الافتراضية للفئة الأساسية وجميع الفئات المشتقة متطابقة. إذا كانت الوظيفتان لهما نفس الاسم ولكن بنماذج أولية مختلفة، فستعتبرهما لغة C++ بمثابة وظائف مثقلة.
- لا يمكننا أن يكون لدينا منشئ افتراضي، ولكن يمكن أن يكون لدينا مدمر افتراضي
- ضع في اعتبارك الموقف الذي لا نستخدم فيه الكلمة الأساسية الافتراضية.
#include using namespace std; class A { int x=5; public: void display() { std::cout << 'Value of x is : ' << x<<std::endl; } }; class b: public a { int y="10;" public: void display() std::cout << 'value of is : ' <<y<<std::endl; main() *a; b b; a->display(); return 0; } </std::endl;>
انتاج:
Value of x is : 5
في المثال أعلاه، * a هو مؤشر الفئة الأساسية. يمكن للمؤشر الوصول إلى أعضاء الفئة الأساسية فقط وليس أعضاء الفئة المشتقة. على الرغم من أن لغة C++ تسمح للمؤشر الأساسي بالإشارة إلى أي كائن مشتق من الفئة الأساسية، إلا أنه لا يمكنه الوصول مباشرة إلى أعضاء الفئة المشتقة. لذلك، هناك حاجة إلى وظيفة افتراضية تسمح للمؤشر الأساسي بالوصول إلى أعضاء الفئة المشتقة.
مثال على وظيفة C++ الافتراضية
دعونا نرى المثال البسيط للوظيفة الافتراضية C++ المستخدمة لاستدعاء الفئة المشتقة في البرنامج.
#include { public: virtual void display() { cout << 'Base class is invoked'<<endl; } }; class b:public a { public: void display() cout << 'derived is invoked'<<endl; int main() a* a; pointer of base b b; object derived a->display(); //Late Binding occurs } </endl;>
انتاج:
Derived Class is invoked
وظيفة افتراضية خالصة
- لا يتم استخدام الوظيفة الافتراضية لأداء أي مهمة. إنه بمثابة عنصر نائب فقط.
- عندما لا يكون للوظيفة تعريف، تُعرف هذه الوظيفة باسم ' لا تفعل شيئا ' وظيفة.
- ال ' لا تفعل شيئا تُعرف الوظيفة باسم أ وظيفة افتراضية خالصة . الوظيفة الافتراضية الخالصة هي وظيفة معلنة في الفئة الأساسية التي ليس لها تعريف بالنسبة للفئة الأساسية.
- لا يمكن استخدام فئة تحتوي على وظيفة افتراضية خالصة للإعلان عن كائنات خاصة بها، وتعرف هذه الفئات بالفئات الأساسية المجردة.
- الهدف الرئيسي للفئة الأساسية هو توفير السمات للفئات المشتقة وإنشاء المؤشر الأساسي المستخدم لتحقيق تعدد الأشكال في وقت التشغيل.
يمكن تعريف الوظيفة الافتراضية البحتة على النحو التالي:
virtual void display() = 0;
دعونا نرى مثالا بسيطا:
كيفية اظهار التطبيق في الاندرويد
#include using namespace std; class Base { public: virtual void show() = 0; }; class Derived : public Base { public: void show() { std::cout << 'Derived class is derived from the base class.' <show(); return 0; } < pre> <p> <strong>Output:</strong> </p> <pre> Derived class is derived from the base class. </pre> <p>In the above example, the base class contains the pure virtual function. Therefore, the base class is an abstract base class. We cannot create the object of the base class.</p></show();>
في المثال أعلاه، تحتوي الفئة الأساسية على وظيفة افتراضية خالصة. ولذلك، فإن الفئة الأساسية هي فئة أساسية مجردة. لا يمكننا إنشاء كائن الفئة الأساسية.