الفرق بين الحمولة الزائدة للدالة والتجاوز في C ++
المحتوى
رسم بياني للمقارنة:- تعريف الحمولة الزائدة
- تنفيذ الحمولة الزائدة في C ++
- تعريف التجاوز
- تنفيذ التجاوز في C ++
- التشابه
- خاتمة
في 'الحمولة الزائدة‘نحن نعيد تعريف الوظائف التي تم تحميلها بشكل زائد بنفس اسم الوظيفة ولكن مع اختلاف عدد ونوع المعلمات. في 'هيمنة"النموذج الأولي للوظيفة المتجاوزة" هو نفسه في جميع أنحاء البرنامج ، لكن الوظيفة المراد تخطيها تسبقها كلمة "افتراضية" في الفئة الأساسية ويتم إعادة تعريفها بواسطة الفئة المشتقة دون أي كلمة رئيسية.
تعددية الأشكال واحدة من السمات الأساسية ل OOP. يعني ببساطة "استخدام اسم واحد لأشكال متعددة". يمكن تنفيذ تعدد الأشكال باستخدام "التحميل الزائد على الوظائف" و "التحميل الزائد للمشغل" و "الوظيفة الافتراضية". يعني كل من "الحمولة الزائدة" و "الغالبة" مفهوم تعدد الأشكال. هنا ، "التحميل الزائد" هو تعدد أشكال الترجمة و "التخطي" هو تعدد أشكال وقت التشغيل. مزيد من الدراسة ، إذا تحدثنا عن الفرق الرئيسي في "التحميل الزائد" و "التجاوز".
علاوة على ذلك ، نحن ندرس الفرق بين الحمولة الزائدة والتجاوز بمساعدة مخطط المقارنة.
- رسم بياني للمقارنة
- تعريف
- الاختلافات الرئيسية
- التشابه
- خاتمة
رسم بياني للمقارنة:
أساس للمقارنة | الحمولة الزائدة | هيمنة |
---|---|---|
النموذج المبدئي | يختلف النموذج الأولي حيث قد يختلف عدد أو نوع المعلمة. | يجب أن يكون كل جانب من جوانب النموذج الأولي نفسه. |
الكلمة | لا توجد كلمات أساسية يتم تطبيقها أثناء التحميل الزائد. | الوظيفة التي يجب تجاوزها تسبقها كلمة افتراضية ، في الفئة الأساسية. |
عامل مميز | يختلف رقم المعلمة أو نوعها الذي يحدد إصدار الوظيفة الذي يتم استدعاؤه. | أي فئة من الفئات يتم استدعاؤها بواسطة المؤشر ، يتم تحديدها بواسطة ، وعنوان أي فئة من فئات الفئات يتم تعيينها لهذا المؤشر. |
تحديد نمط | يتم إعادة تعريف الوظيفة بنفس الاسم ، لكن مع اختلاف عدد ونوع المعلمة. | يتم تعريف الوظيفة ، مسبوقة بكلمة افتراضية في الفئة الرئيسية ويتم إعادة تعريفها بواسطة فئة مشتقة باستخدام كلمة رئيسية خارج. |
وقت الإنجاز | وقت الترجمة. | وقت التشغيل. |
منشئ / وظيفة افتراضية | البنائين يمكن طاقتها. | وظيفة افتراضية يمكن التغلب عليها. |
المدمر | المدمر لا يمكن أن تكون مثقلة. | يمكن تدمير المدمرة. |
ربط | التحميل الزائد يحقق الربط المبكر. | الغلبة تشير إلى الارتباط المتأخر. |
تعريف الحمولة الزائدة
يُطلق على تعدد أشكال الترجمة "الحمل الزائد". نظرًا لأن التحميل الزائد يتم إنشاؤه من مفهوم تعدد الأشكال ، فإنه يوفر "واجهة مشتركة لأساليب متعددة". هذا يعني ، إذا تم تحميل وظيفة بشكل زائد ، فإنها تحتوي على نفس اسم الوظيفة أثناء إعادة تعريفها.
تختلف وظائف التحميل الزائد فيما يتعلق بـ "رقم أو نوع المعلمة (المعلمات)" المختلف ، مما يجعل إحدى وظائف التحميل الزائد مختلفة عن الأخرى. بهذه الطريقة ، يتعرف المحول البرمجي على استدعاء دالة overloaded. أكثر الوظائف التي يتم تحميلها بشكل شائع هي "المنشئات". "نسخ المنشئ" هو نوع من "التحميل الزائد للمنشئ".
تنفيذ الحمولة الزائدة في C ++
التحميل الزائد للفئة {int a، b؛ public: int load (int x) {// first load () function a = x؛ إرجاع } int load (int x، int y) {// second load () function a = x؛ ب = ذ؛ إرجاع * ب ؛ }} ؛ int main () {overload O1؛ O1.load (20)؛ // first load () وظيفة استدعاء O1.load (20،40)؛ // second load () call function}
هنا تم تحميل overloaded تحميل دالة () من التحميل الزائد للفئة. يمكن تمييز الدالتين overloaded للفئة بطريقة تقبل الدالة load () الأولى فقط معلمة عدد صحيح واحد ، بينما تقبل الدالة load الثانية () معلمتين عدد صحيح. عندما يستدعي كائن التحميل الزائد للفئة الدالة load () بمعلمة واحدة ، يتم استدعاء الدالة load () الأولى. عندما يستدعي الكائن وظيفة load () ويمر معلمتين ، يتم استدعاء وظيفة load () الثانية.
تعريف التجاوز
يسمى تعدد الأشكال الذي تم تحقيقه أثناء وقت التشغيل بـ "التجاوز" ، ويتم تحقيقه باستخدام "الميراث" و "الدوال الافتراضية". تسبق الوظيفة المراد تجاوزها الكلمة "افتراضية" في فئة أساسية ويتم إعادة تعريفها في فئة مشتقة بدون أي كلمة رئيسية.
أحد أهم الأشياء التي يجب تذكرها في حالة تجاوزها هو أن النموذج الأولي للدالة المهجورة يجب ألا يتغير بينما تقوم الفئة المشتقة بإعادة تعريفها. عند إعطاء دالة متجاوزة ، تحدد C ++ إصدار الوظيفة الذي يسمى على أساس "نوع الكائن الذي يشير إليه مؤشر" والذي يتم به استدعاء الوظيفة.
تنفيذ التجاوز في C ++
class base {public: virtual void funct () {// virtual function of cout class cout << "This is a class class funct ()"؛ }} ؛ class المشتق 1: public base {public: void funct () {// دالة ظاهرية لفئة الأساس المعاد تعريفها في cout المشتقة من الفئة 1 << "هذا هو funct (1) فئات مشتقة ()"؛ }} ؛ class المشتق 2: قاعدة عامة {public: void funct () {// دالة افتراضية لفئة الأساس المعاد تعريفها في cout المشتقة من فئة class2 << "هذه وظيفة مشتقة من فئات 2 ()"؛ }} ؛ int main () {base * p، b؛ مشتقة 1 د 1 ؛ مشتقة 2 d2 ؛ * ص = & ب. P-> وظي ()؛ / / استدعاء الفئة الأساسية funct (). * ص = & D1. P-> وظي ()؛ / / استدعاء ل 1 funct فئة (). * ص = & D2. P-> وظي ()؛ / / استدعاء ل fun2 فئة مشتقة (). عودة 0 ؛ }
هنا ، هناك فئة أساسية واحدة موروثة بشكل عام بواسطة فئتين مشتقتين. يتم تعريف الوظيفة الافتراضية في فئة أساسية بكلمة رئيسية "افتراضية" ، ويتم إعادة تعريفها بواسطة كلتا الفئتين المشتقتين بدون أي كلمة رئيسية. في main () ، تنشئ الفئة الأساسية متغير المؤشر 'p' وكائن 'b' ؛ ‘المشتقة 1 ′ الفئة تنشئ كائن d1 و تنشئ الفئة المشتقة 2 كائن d2.
الآن ، في البداية ، يتم تعيين عنوان كائن الفئة الأساسية "ب" إلى مؤشر الفئة الأساسية "p". ‘p 'يعطي مكالمة إلى الدالة funct () ، لذلك تسمى وظيفة الفئة الأساسية.ثم يتم تعيين عنوان كائن صنف 1 مشتق "d1" على المؤشر "p" ، ومرة أخرى فإنه يطلق على funct () ؛ هنا يتم تنفيذ الدالة funct () للفئة المشتقة 1. أخيرًا ، يتم تعيين المؤشر 'p' على كائن الطبقة المشتقة 2. ثم calls p calls ‘دالة funct () التي تنفذ الدالة funct () للفئة المشتقة 2.
إذا لم تقم الفئة المشتقة 1 / المشتقة 2 بإعادة تعريف funct () ، فسيتم استدعاء funct () للفئة الأساسية ، لأن الوظيفة الافتراضية تكون "هرمية".
- يختلف النموذج الأولي للدالة التي يتم تحميلها بشكل زائد بسبب نوع وعدد المعلمات التي يتم تمريرها إلى الدالة overloaded. من ناحية أخرى ، لا يتغير النموذج الأولي للدالة المتجاوزة لأن وظيفة متجاوزة تقوم بعمل مختلف لفئة مختلفة تنتمي إليها ولكن بنفس نوع وعدد المعلمات.
- لا يسبق اسم الوظيفة المثقلة بأية كلمة أساسية ، بينما يسبق اسم الدالة المهجورة بالرمز keyord "الظاهري" في الفئة الأساسية فقط.
- تعتمد الدالة overloaded التي تعتمد على نوع أو عدد المعلمة التي يتم تمريرها إلى الدالة. تعتمد الدالة المهجورة التي يتم فيها استدعاء الفئة ، على تعيين عنوان كائن الفئة للفئة ، التي استدعت الدالة.
- يتم حل وظيفة overloaded التي سيتم استدعاء أثناء وقت الترجمة. يتم حل أي وظيفة تجاوز يتم استدعاؤها أثناء وقت التشغيل.
- البنائين يمكن طاقتها ولكن لا يمكن تجاوزها.
- لا يمكن تحميل المدمرات طاقتها ، ولكن يمكن تجاوزها.
- التحميل الزائد يحقق الربط المبكر حيث يتم استدعاء الوظيفة الزائدة التي سيتم استدعاء حلها أثناء وقت الترجمة. يحقق Overriding الارتباط المتأخر حيث يتم حل الوظيفة التي سيتم استبدالها أثناء وقت التشغيل.
التشابه
- يتم تطبيق كلاهما على وظائف الأعضاء في الفصل.
- تعدد الأشكال هو المفهوم الأساسي وراء كل منهما.
- يظل اسم الوظيفة كما هو أثناء تطبيق التحميل الزائد والتجاوز على الوظائف.
خاتمة
الحمولة الزائدة وتجاوز تبدو متشابهة ، ولكن هذا ليس هو الحال. يمكن زيادة التحميل على الوظائف ، لكن لا يمكن لأي فئة إعادة تعريف وظيفة التحميل الزائد في المستقبل. لا يمكن تحميل وظيفة افتراضية ؛ يمكن فقط أن يتم تجاوزها.