كيفية تنفيذ الوظيفة الافتراضية في C ++؟



ستقدم لك هذه المقالة مفهوم برمجة آخر وهو الوظيفة الافتراضية في C ++. سيتم دعم المفهوم من خلال مظاهرة.

وظيفة افتراضية في C ++ هي وظيفة عضو ضمن الفئة الأساسية التي نعيد تعريفها في فئة مشتقة. ستساعدك هذه المقالة في استكشاف المفهوم بالتفصيل. سيتم تغطية المؤشرات التالية في هذه المقالة ،

لذلك دعونا نبدأ بهذه المقالة حول الوظيفة الافتراضية في C ++





ما هي الوظيفة الافتراضية؟

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

الانتقال إلى هذه المقالة حول الوظيفة الافتراضية في C ++



قواعد الوظيفة الافتراضية في C ++:

  • يتم تعريفها دائمًا في فئة أساسية ويتم تجاوزها في فئة مشتقة ولكن ليس من الضروري تجاوزها في الفئة المشتقة.
  • يجب الإعلان عن الوظائف الافتراضية في القسم العام من الفصل.
  • لا يمكن أن تكون وظيفة ثابتة أو صديقة كما لا يمكن أن تكون الوظيفة الافتراضية لفئة أخرى.
  • يجب الوصول إلى الوظائف الافتراضية باستخدام مؤشر لتحقيق تعدد أشكال وقت التشغيل.

المضي قدمًا في هذه المقالة حول الوظيفة الافتراضية في C ++.

ما هو ملزم؟

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

الانتقال إلى هذه المقالة حول الوظيفة الافتراضية في C ++



التجليد المبكر

الربط المبكر هو ظاهرة يحدث فيها قرار مطابقة العديد من استدعاءات الوظائف في وقت الترجمة نفسه ويربط المحول البرمجي الرابط بالعناوين مباشرةً. يُعرف أيضًا باسم الربط الثابت أو ربط وقت التجميع.

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

مثال

#include using namespace std class Animals {public: void sound () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <sound () // إرجاع الربط المبكر 0}

انتاج |

الإخراج- الوظيفة الافتراضية في C ++ - Edureka

توضيحات أيون
في هذا المثال ، أنشأنا مؤشرًا لفئة الحيوانات الأصلية. ثم بكتابة a = & c ، بدأ المؤشر 'a' بالإشارة إلى الكائن c لفئة Cats.
a -> sound () - عند استدعاء صوت الوظيفة () الموجود في كلا الفئتين بواسطة المؤشر 'a' ، يتم استدعاء وظيفة الفئة الأم ، حتى لو كان المؤشر يشير إلى كائن من الفئة Cats .

هذا بسبب التجليد المبكر. نحن نعلم أن 'a' هو مؤشر للفئة الأصلية تشير إلى كائن من الفئة الفرعية. نظرًا لأن الربط المبكر يحدث في وقت الترجمة ، لذلك عندما رأى المترجم أن 'a' هو مؤشر للفئة الأصلية ، فإنه يطابق الاستدعاء بوظيفة 'sound ()' للفئة الأصلية دون البحث عن الكائن الذي يشير إليه يشير إلى.

ثابت وظيفة العضو c ++

المضي قدمًا في هذه المقالة حول الوظيفة الافتراضية في C ++

ملزم متأخر

في الربط المتأخر ، يحدد المترجم الكائن في وقت التشغيل ثم يطابق استدعاء الوظيفة مع الوظيفة الصحيحة. يُعرف أيضًا باسم الربط الديناميكي أو ربط وقت التشغيل.

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

مثال

#include using namespace std class Animals {public: virtual void sound () {cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <صوت () إرجاع 0}

انتاج |

تفسير
هنا يتم جعل صوت الوظيفة () الخاص بالفئة الأساسية افتراضيًا ، وبالتالي يقوم المترجم الآن بتنفيذ الربط المتأخر لهذه الوظيفة. الآن ، سيتم مطابقة استدعاء الوظيفة لوظيفة sound () مع تعريف الوظيفة في وقت التشغيل. نظرًا لأن المترجم يحدد الآن المؤشر 'a' على أنه يشير إلى الكائن 'c' من الفئة المشتقة Cats ، فإنه سوف يستدعي وظيفة sound () لفئة Cats.

المضي قدمًا في هذه المقالة حول الوظيفة الافتراضية في C ++

وظيفة افتراضية خالصة

الوظيفة الافتراضية الخالصة في C ++ هي وظيفة افتراضية ليس لدينا تنفيذ لها ، نحن نعلن عنها فقط. يتم الإعلان عن وظيفة افتراضية خالصة من خلال تخصيص 0 في الإعلان.

صوت الفراغ الظاهري () = 0

هنا الصوت () هو تأثير افتراضي خالص.

الانتقال إلى هذه المقالة حول الوظيفة الافتراضية في C ++

فئة مجردة

يتم تعريف الفئة المجردة على أنها فئة ذات وظيفة افتراضية نقية واحدة أو أكثر. كما هو موضح أعلاه ، فإن الوظيفة الافتراضية البحتة هي وظيفة عضو افتراضية تم تمييزها على أنها لا تحتوي على تنفيذ. لا يمكن تطبيقه مع المعلومات المقدمة في الفصل ، بما في ذلك أي فئات أساسية. تُعرف الفئة المجردة أيضًا باسم فئة أساسية مجردة.

مثال

#include using namespace std class Employee // abstract base class {virtual int getSalary () = 0 // pure virtual function} class Employee_1: public Employee {int pay public: Employee_1 (int s) {insurance = s} int getSalary () {return راتب}} class Employee_2: موظف عمومي {int راتب عام: Employee_2 (int t) {راتب = t} int getSalary () {return راتب}} int main () {Employee_1 e1 (5000) Employee_2 e2 (3000) int أ ، با = e1.getSalary () ب = e2.getSalary () cout<< 'Salary of Developer : ' << a << endl cout << 'Salary of Driver : ' << b << endl return 0 } 

انتاج |

تفسير
وظيفة 'getSalary ()' في فئة الموظف هي وظيفة افتراضية خالصة. نظرًا لأن فئة الموظف تحتوي على الوظيفة الافتراضية البحتة ، فهي فئة أساسية مجردة.
نظرًا لأنه يتم تحديد الوظيفة الافتراضية البحتة في الفئات الفرعية ، فإن الوظيفة 'getSalary ()' يتم تحديدها في كلا الفئتين الفرعيتين لفئة الموظف ، أي في Employee_1 و Employee_2.

الانتقال إلى هذه المقالة حول الوظيفة الافتراضية في C ++

مثال على الوظيفة الافتراضية

#include using namespace std class base {public: void function_1 () {cout<< 'base class function 1n' } virtual void function_2() { cout << 'base class function 2n' } virtual void function_3() { cout << 'base class function 3n' } virtual void function_4() { cout << 'base class function 4n' } } class derived : public base { public: void function_1() { cout << 'derived class function 1n' } void function_2() { cout << 'derived class function 2n' } void function_4(int x) { cout function_2 () ptr-> function_3 () ptr-> function_4 ()}

انتاج |

تفسير
بالنسبة إلى function_1 () استدعاء الوظيفة ، يتم استدعاء إصدار الفئة الأساسية من الوظيفة ، ويتم تجاوز الوظيفة_2 () في الفئة المشتقة ، لذلك يُطلق على إصدار الفئة المشتقة ، لا يتم تجاوز الدالة function_3 () في الفئة المشتقة وهي وظيفة افتراضية لذلك يُطلق على إصدار الفئة الأساسية وبالمثل لا يتم تجاوز function_4 () لذلك يتم استدعاء إصدار الفئة الأساسية.

وهكذا وصلنا إلى نهاية هذه المقالة حول 'الوظيفة الافتراضية في C ++'. إذا كنت ترغب في معرفة المزيد ، تحقق من بواسطة Edureka ، شركة تعليمية موثوقة عبر الإنترنت. تم تصميم دورة تدريب وإصدار شهادات Java J2EE و SOA من Edureka لتدريبك على مفاهيم Java الأساسية والمتقدمة جنبًا إلى جنب مع العديد من أطر Java مثل Hibernate & Spring.

لديك سؤال لنا؟ يرجى ذكر ذلك في قسم التعليقات في هذه المدونة وسنعاود الاتصال بك في أقرب وقت ممكن.