الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

لغز التكرار

مغلق
بدأه ♥ حُوريّة ♥ في 21 فبراير 2008 · 8 رد · 2,054 مشاهدة · في اختبر قداراتك
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم
======
اقرأوا الشيفرة التالية وجاوبوا على السؤال.

#include <iostream>
using std::cout;
using std::endl;

class B
{
public:
    virtual void Hello()
    {
        cout << "Hello from class B" << endl;
    }

    void Welcome()
    {
        cout << "Welcome: ";
        Hello();
    }
};

class D : public B
{
public:
    void Hello()
    {
        cout << "Hello from class D" << endl;
        B::Welcome();
    }
};

int main(int argc, char* argv[])
{
    D d;
    d.Hello();
}

يا ترى لش يحدث التكرار؟ شو السبب يعني؟ :wacko:

انتبهوا:
لما رح تطبقوا الشيفرة رح يكون هناك تكرار لا منتهي An Infinite Loop لكن عادي تقدروا تقفلوا البرنامج بإقفال النافذة
=====

تمنياتي لكم

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 17 ديسمبر 2013 في 23:19 — السبب: إنقاذ الكود

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#2

1- بداية سيتم استدعاء الدالة Hello الخاصة بـ D

2- ثم بعدها يتم استدعء الدالة Welcome الخاصة بـ B

3- التي بدورها تستدعي الدالة Hello الخاصة بـ D لنعود لـ بند 1

وهكذا......

لو كانت هذه مشكلة فحلها :

B::Hello();

تم تعديل هذه المشاركة بواسطة إسماعيل ابراهيم في 21 فبراير 2008 في 17:29

#3

السلام عليكم :)

سأبدأ بأول حل بإذن الله و إن شاء الله سيكون صحيحاً B)

المشكلة كلها في هذين السطرين :

cout << "Welcome: ";
Hello();

لماذا ؟ لأن الدالة Hello هي دالة Virtual حتى لو قمنا باستدعائها من الصنف B,

عند استدعائها في الكود المترجم لن يحدد أي صنف تتبع له, عملية ربطها لن تتم وقت الترجمة, و لكن ستتم وقت التنفيذ Late Binding.

و بسبب هذا الشيء يحصل التكرار اللانهائي,

أولاً قمنا بتعريف كائن من الصنف الذي قام بعملية الاشتقاق :

D d;

قمنا باستدعاء الدالة Hello من الصنف D :

d.Hello();

الدالة Hello تقوم باستدعاء الدالة Welcome من الصنف B :

  B::Welcome();

إلى هنا الكود لا غبار عليه,

المشكلة تظهر في الدالة Welcome التي تقوم باستدعاء الدالة Hello مرة أخرى, و بما أن الكائن معرف أصلاً على أنه من الصنف D, إذاً سيتم استدعاء الدالة Hello المعرفة في الصنف D مرة أخرى, و التي تستدعي بدورها Welcome مرة أخرى و هكذا في حلقة لا نهائية,

عموماً الحلقة ليست لا نهائية, و إنما سيستمر تنفيذ البرنامج حتى يمتلئ الـ Stack الخاص ببرنامجنا في الذاكرة,

تحياتي, و شكراً على اللغز الجميل جداً أخت رغد :)

==========================

تعديل :

يبدو أن أخي اسماعيل كتب الرد قبل أن ألحق :)

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 21 فبراير 2008 في 17:31 — السبب: :(

#4

هههههه

خالد...

قمت بكتابة ردي في الوقت الذي كنت انت تكتب وبهذا أكون أنا من وضع الحل الأول .... ضيعت عليك الفرصة :)

أردت التطرق لـ تعدد الأشكال في ردي ثم قررت ألا أفعل، وبهذا سبقتك :):)

#5

أهلاً اسماعيل,

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

عموماً خيرها بغيرها :D

و أنا كاتب بأول الرد إن شاء الله كون أول واحد :mad: :D

#6

كلكوا حليتوا اللغز :thumb_up:

======

حل الأخ اسماعيل تجريدي, والأخ خالد حل تفصيلي, وكلياتهن حلول سليمة

======

انا محتارة بيناتكم :blush: ...مين اللي حل اللغز؟ خلاص طالما انتوا رضيانين مع بعض شو دخلني :) وطالما شرط الألغاز يعتمد على الحل الصحيح مبدئياً واللي يقدم الحل أولاً..

يعني اسماعيل صراحة :)

======

تمنياتي لكم بالتوفيق

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#7

اووووه يا رغد ..

يعني يوم امس انا كله كنت جالس في المنتدى ... مكتبتي اللغز .. الا في الوقت اللي انا خارج ..؟؟

اعطونا الفرصه لنشارك معكم .. لانه ستاخذ عنا نظره باننا نتهرب من الحلول ..

صح ولا لا يا رغد ؟؟

تحياتي العطرة ولغز جميل .. لقد قمت بحل اللغز مباشرة بمجرد النظر من دون تطبيق البرنامج ولكن عندما نزلت لقراءة بقية الردود وجدت ان اسماعيل وخالد قاموا بالحل ايضا ..

لذلك لن اضع الحل لانه نفس الحلول السابقه ..

تحياتي العطرة ..

يَارَبُ إِن ضَاقَت قُلُوُب الْنَّاسٍ عَنْ مّافِي .. مِنْ خَيْرٍٍ فَعَفْوكَ لَا يَضِيْقْ ..

#8

يا الله ... زمان عن البرمجة بال ++C

سبحان الله اللغة اللي مستحيل تفارقني ... :lol:

الجواب بسيط ... التكرار من هذا السطر

B::Welcome();

لأنه في هذه الدالة سيتم إستدعاء الدالة Hello ولأانه Virtual فسيأخذ أخر تعريف لها الكلاس D وليس B ...

طبعاً هذا تفسير مبسط ... ولا هي أصلاً مرتبطه بال Static Binding و Runtime Binding و Virtual Table ...

أقترح تكتبين كلاس فيه virutal method وتتابعين طريقة إستدعائه بالأسبملي ... وتشيليين ال virtual وتلاحظيين الفرق B)

#9

باين هيك انت ليك زمان عن المنتدى مش بس البرمجة بلغة ++C..لأن الموضوع عتيق شوي :happy:

,.,.,.,.,.,.,.,.,.,.

عموماً مشاركة مفيدة عاملة تجديد للموضوع..

,.,.,.,.,.,.,.,.,.,.

شاكرة لك اخي b.m.c

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

هذا الموضوع مغلق.

مواضيع مشابهة