علاوة على ذلك ، ندرس الفرق بين التحميل الزائد والفرط بمساعدة مخطط المقارنة.
رسم بياني للمقارنة:
أساس للمقارنة | الحمولة الزائدة | هيمنة |
---|---|---|
النموذج المبدئي | يختلف النموذج الأولي لأن عدد أو نوع المعلمة قد يختلف. | كل جانب من جوانب النموذج يجب أن يكون نفسه. |
الكلمة | لا يتم تطبيق أي كلمة رئيسية أثناء التحميل الزائد. | تسبق الدالة التي سيتم تجاوزها كلمة أساسية "افتراضية" ، في الفئة الأساسية. |
عامل التمييز | يختلف رقم أو نوع المعلمة الذي يحدد إصدار الدالة الذي يتم استدعاؤه. | يتم استدعاء الدالة أي فئة بواسطة المؤشر ، يتم تحديد بواسطة عنوان الكائن الذي تم تعيينه إلى هذا المؤشر. |
تحديد النمط | يتم إعادة تعريف الوظيفة بنفس الاسم ، لكن تختلف عن رقم ونوع المعلمة. | يتم تعريف الدالة ، مسبوقة بكلمة مفتاحية "افتراضية" في الفصل الرئيسي وإعادة تعريفها بفئة مشتقة مع الكلمة الرئيسية. |
وقت الإنجاز | وقت الترجمة. | تشغيل الوقت. |
منشئ / وظيفة افتراضية | يمكن زيادة حمولة المنشئات. | يمكن تجاوز الوظيفة الظاهرية. |
المدمر | لا يمكن أن يكون المدمر فوق طاقته. | يمكن تجاوز Destructor. |
ربط | الحمولة الزائدة يحقق الربط المبكر. | Overpiding يشير إلى الرابطة المتأخرة. |
تعريف الحمولة الزائدة
يسمى تعدد الأشكال وقت التجميع "التحميل الزائد". كما يتم إنشاء الحمولة الزائدة من مفهوم تعدد الأشكال ، فإنه يوفر "واجهة مشتركة لطرق متعددة". وهذا يعني أنه إذا كانت هناك وظيفة محملة بشكل زائد ، فإنها تحتوي على نفس اسم الوظيفة أثناء إعادة تعريفها.
وتختلف الدوال المثقلة عن العمل فيما يتعلق بـ "عدد أو نوع المعلمات (المعلمات) المختلفة" ، مما يجعل وظيفة حمولة زائدة عن بعضها مختلفة عن الأخرى. وبهذه الطريقة ، يتعرف المحول البرمجي على الوظيفة التي يتم تحميلها فوق طاقتها. معظم الوظائف الشائعة بشكل زائد هي "المنشئات". "منشئ النسخ" هو نوع من "التحميل الزائد منشئ".
تنفيذ الحمولة الزائدة في C ++
الطبقة الزائدة {int a، b؛ public: int int (int x) {/ first load () function a = x؛ عودة } int int (int x، int y) {// second load () function a = x؛ ب = ذ؛ ارجع a * b؛ }}؛ int main () {overload O1؛ O1.load (20)؛ // first load () استدعاء دالة O1.load (20،40)؛ // second load () function call}
هنا تم تحميل الحمل وظيفة () من الحمل الزائد. يمكن تمييز الدالتين الزائدتين للفئة بطريقة تقبل الدالة load () الأولى معلمة عدد صحيح واحد فقط ، بينما تقبل دالة load () الثانية معلمتين صحيحتين. عندما يستدعي كائن الحمل الزائد للفئة الدالة load () بمعلمة واحدة ، يتم استدعاء الدالة load () الأولى. عندما يستدعي استدعاء الدالة () الدالة تمرير معلمتين ، يتم استدعاء الدالة load () الثانية.
تعريف Overriding
يسمى تعدد الأشكال الذي تحقق خلال فترة التشغيل "تجاوز". يتم إنجازه باستخدام "الميراث" و "الوظائف الظاهرية". تسبق الدالة التي يتم تجاوزها الكلمة الأساسية "افتراضية" في فئة أساسية وإعادة تعريفها في فصل دراسي مشتق بدون أي كلمة رئيسية.
أحد أهم الأشياء التي يجب تذكرها في حالة تجاوزها هو أن النموذج الأولي للدالة التي تم تجاوزها لا يجب أن يتغير بينما تعيد الطبقة المشتقة تعريفها. عندما تعطى الدالة overridden مكالمة ، يحدد C ++ أي نسخة من الدالة يتم استدعاؤها على أساس "نوع الكائن المدبب بمؤشر" الذي يتم من خلاله استدعاء الدالة.
تنفيذ تجاوز في C ++
class class {public: virtual void funct () {// virtual function of base class cout << "This is a base class's funct ()"؛ }}؛ فئة مشتقة 1: public base {public: void funct () {/ virtual function of bas class redefined in derived1 class cout << "This is a derived1 class's funct ()"؛ }}؛ فئة مشتقة 2: قاعدة عامة {public: void funct () {/ / virtual function of bas class redefined in derived2 class coutوظي ()؛ // call to derived1 classct (). * ص = & D2. P-> وظي ()؛ // call to derived2 classct (). العودة 0 ؛ }
هنا ، هناك فئة أساسية مفردة موروثة بشكل عام بفئتين مشتقتين. يتم تعريف دالة ظاهرية في فئة أساسية مع كلمة أساسية "افتراضية" ، ويتم إعادة تعريفها بواسطة كل من الطبقات المشتقة بدون أي كلمة رئيسية. في main () ، تنشئ الطبقة الأساسية متغير مؤشر 'p' و كائن 'b'؛ "class1 ′ class ينشئ كائن d1 ويقوم class2 بإنشاء كائن d2".
الآن ، يتم تعيين عنوان الكائن الأساسي 'b' في البداية إلى مؤشر الفئة الأساسية 'p'. يعطي 'p' استدعاء الدالة funct () ، لذلك يتم استدعاء دالة للفئة الأساسية. ثم يتم تعيين عنوان كائن الفئة 1 المشتقة 'd1' إلى المؤشر 'p' ، مرة أخرى فإنه يعطي استدعاء funct ()؛ هنا يتم تنفيذ الوظيفة funct () للفئة المشتقة. وأخيرًا ، يتم تعيين المؤشر "p" على كائن class2 المشتق. ثم تقوم 'p' باستدعاء وظيفة funct () التي تقوم بتنفيذ الدالة func () للفئة المشتقة.
إذا لم تعِد فئة المشتقة / المشتقة 2 من إعادة تحديد funct () ، فسيتم استدعاء funct () للفئة الأساسية ، لأن الوظيفة الظاهرية هي 'hierarchical'.
الاختلافات الرئيسية بين الحمولة الزائدة وتجاوز
- يختلف نموذج الدالة التي يتم تحميلها فوق طاقتها بسبب نوع المعلمة التي تم تمريرها إلى الدالة المحملة فوق طاقتها وعددها. من ناحية أخرى ، لا يتغير النموذج الأولي للدالة التي تم تجاوزها لأن وظيفة تجاوزها تؤدي عملًا مختلفًا للفئة المختلفة التي تنتمي إليها ولكن مع نفس النوع وعدد المعلمة.
- لا يتطابق اسم الدالة المحملة مع أي كلمة رئيسية بينما يسبق اسم الدالة التي تم تخطيها المفتاح الأساسي "Virtual" في الفئة الأساسية فقط.
- تعتمد الدالة التي يتم تحميلها فوق طاقتها على نوع المعلمة التي يتم تمريرها إلى الدالة أو عددها. تعتمد الدالة overredden للفئة التي يتم استدعاؤها على ، يتم تعيين عنوان الكائن للفئة إلى المؤشر ، والذي قام باستدعاء الدالة.
- يتم حل الدالة التي يتم تحميلها بشكل زائد أثناء عملية التحويل البرمجي. يتم حل أي وظيفة تم تجاوزها يتم استدعاؤها أثناء وقت التشغيل.
- يمكن أن يكون المبنيون فوق طاقتهم ولكن لا يمكن تجاوزها.
- لا يمكن أن تكون المدمرة أكثر من طاقتها ، ولكن يمكن تجاوزها.
- التحميل الزائد يحقق الربط المبكر حيث يتم استدعاء الدالة المحملة فوق طاقتها أثناء عملية التحويل البرمجي. يحقق تجاوز الربط المتأخر حيث يتم استدعاء الدالة التي تم تجاوزها أثناء التشغيل.
التشابه
- كلاهما يتم تطبيقه على وظائف الأعضاء في الفصل.
- تعدد الأشكال هو المفهوم الأساسي وراء كل منهما.
- يظل اسم الوظيفة كما هو أثناء تطبيق التحميل الزائد وتجاوز الوظائف.
استنتاج
يبدو التحميل الزائد والغياب متشابهين ، ولكن هذا ليس هو الحال. يمكن أن تكون المهام أكثر من طاقتها ، ولكن لا يمكن لأي فئة أن تعيد تعريف الوظيفة المثقلة في المستقبل. لا يمكن تحميل الوظيفة الظاهرية ؛ يمكن فقط تجاوزها.