تجاوز الوظيفة في C ++ [زيادة التحميل على الوظيفة مقابل التجاوز بالأمثلة]

نشرت: 2021-05-25

يعد تجاوز الوظيفة في C ++ ميزة تتيح لنا استخدام وظيفة في الفصل الفرعي الموجود بالفعل في صنفه الأصلي. يرث الفصل الفرعي جميع أعضاء البيانات ، ووظائف العضو الموجودة في الفصل الأصلي. إذا كنت ترغب في تجاوز أي وظيفة في الفصل الفرعي ، فيمكنك تنفيذ تجاوز الوظيفة. يعني تجاوز الوظيفة إنشاء إصدار أحدث من وظيفة الفئة الأصل في الفصل الفرعي.

جدول المحتويات

وظائف C ++

دالة C ++ هي مجموعة من العبارات التي تجتمع لتنفيذ مهمة. يحتوي كل برنامج على وظيفة () رئيسية على الأقل ويمكن أن تحتوي برامج معينة على وظائف إضافية.

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

تحديد الوظيفة

الصيغة العامة لوظيفة C ++ هي:

return_type function_name (قائمة المعلمات) {

وظيفة الجسم

}

تشتمل أي دالة C ++ على رأس دالة وجسم. مكونات دالة C ++ هي:

نوع الإرجاع - يمثل نوع الإرجاع نوع القيمة المرجعة للدالة.

اسم الوظيفة- يشير هذا إلى اسم الوظيفة. يشكل اسم الوظيفة مع قائمة المعلمات توقيع الوظيفة.

المعلمات - المعلمة هي عنصر نائب للقيمة التي تُرجعها الدالة. عندما يتم استدعاء وظيفة ، يتم تمرير قيمة إلى المعلمة التي تسمى المعلمة الفعلية.

جسم الوظيفة- يشكل الجسم الوظيفي قائمة العبارات التي تحدد ما ستفعله الوظيفة.

استدعاء وظيفة

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

تحتاج إلى تمرير المعلمات المطلوبة بما في ذلك اسم الوظيفة لاستدعاء وظيفة. إذا قامت الدالة بإرجاع قيمة ، فيمكن تخزين القيمة. هناك عدة طرق يمكن من خلالها تمرير الوسيطات إلى دالة أثناء استدعائها. أنواع المكالمات هي Call by Value و Call by Reference و Call by Pointer.

تجاوز الوظيفة في C ++

عندما تحدد فئة مشتقة أو فئة فرعية دالة تم تعريفها بالفعل في الفئة الأساسية أو الفئة الأصلية ، فإنها تسمى تجاوز الوظيفة في C ++. يساعدنا تجاوز الوظيفة على تحقيق تعدد أشكال وقت التشغيل. إنه يمكّن المبرمجين من تنفيذ تنفيذ محدد لوظيفة مستخدمة بالفعل في الفئة الأساسية.

مثال:

مصدر

ادرس المثال المذكور أعلاه. هنا الفئة الرئيسية هي "Base" والطبقة الفرعية "مشتقة".

سيكون ناتج البرنامج أعلاه:

الوظيفة المشتقة

يتم التصريح عن الوظيفة print () في كلا الصنفين الأساسي والمشتق. عندما نسمي الوظيفة print () من خلال كائن الفئة المشتقة ، "المشتقة 1" ، يتم استدعاء print () من الفئة المشتقة وتنفيذها عن طريق تجاوز نفس وظيفة الفئة الأساسية.

عمل مبدأ تجاوز الوظيفة

مصدر

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

إذا استدعينا الدالة print () من خلال كائن من الفئة Base ، فلن يتم تجاوز الوظيفة. على سبيل المثال:

// وظيفة الاتصال للفئة الأساسية

قاعدة قاعدة 1 ؛

base1.print () ؛ // الإخراج: وظيفة القاعدة

ناتج الكود أعلاه سيكون:

وظيفة القاعدة

كيفية الوصول إلى الوظائف التي تم تجاوزها في C ++

يجب عليك استخدام عامل تحليل النطاق ، "::" للوصول إلى الوظيفة التي تم تجاوزها. هناك طريقة أخرى للوصول إلى الوظيفة التي تم تجاوزها وهي استخدام مؤشر الفئة الأساسية للإشارة إلى كائن من الفئة المشتقة واستدعاء الوظيفة من خلال المؤشر.

مثال:

مصدر

سيكون ناتج البرنامج أعلاه:

الوظيفة المشتقة

وظيفة القاعدة

العمل على الوصول إلى الوظيفة المتجاوزة

مصدر

هنا يصل البيان المشتق 1.print () إلى وظيفة print () للفئة المشتقة ويصل البيان المشتق2.Base :: print () إلى وظيفة print () للفئة الأساسية.

استدعاء دالة C ++ التي تم تجاوزها من الفئة المشتقة

في هذا الكود ، نسمي الوظيفة المتجاوزة من داخل الفئة المشتقة نفسها.

عمل استدعاء الوظيفة المتجاوز من الفئة المشتقة

مصدر

يستدعي الأمر Base :: print () الوظيفة المتجاوزة من داخل الفئة المشتقة.

تعلم دورات هندسة البرمجيات عبر الإنترنت من أفضل الجامعات في العالم. اربح برامج PG التنفيذية أو برامج الشهادات المتقدمة أو برامج الماجستير لتتبع حياتك المهنية بشكل سريع.

زيادة التحميل على الوظيفة مقابل تجاوز الوظيفة

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

يتم تجاوز الوظيفة في وقت التشغيل. في التجاوز ، يتم إعادة تعريف الفئة الأساسية في الفئة المشتقة بنفس نوع الإرجاع والمعلمات. الاختلافات الأخرى بين تجاوز الوظيفة والحمل الزائد للوظائف في C ++ هي:

1. الميراث

يمكن استخدام تجاوز الوظيفة فقط مع وراثة الفئة بينما لا يتطلب التحميل الزائد للوظيفة وراثة الفئة.

2. وظيفة التوقيع

تختلف الوظائف المحملة بشكل زائد في التوقيع سواء في عدد المعلمات أو نوع المعلمات. في تجاوز الوظيفة ، تظل تواقيع الوظيفة كما هي.

3. نطاق الوظيفة

تختلف الوظائف التي تم تجاوزها في النطاق بينما الوظائف المحملة بشكل زائد لها نفس النطاق.

4. السلوك الوظيفي

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

إذا كنت مهتمًا بمعرفة المزيد حول تطوير البرامج كاملة المكدس ، فراجع برنامج upGrad & IIIT-B's Executive PG في تطوير البرامج الكامل المكدس المصمم للمهنيين العاملين ويقدم أكثر من 500 ساعة من التدريب الصارم ، 9+ مشاريع ، والمهام ، وحالة خريجي IIIT-B ، ومشاريع التخرج العملية العملية والمساعدة في العمل مع الشركات الكبرى.

ما هو تجاوز الوظيفة؟

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

ما هي الفروق بين وظيفة التجاوز والحمل الزائد؟

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

ما هي الوراثة في لغة ++ C؟