Virtual functions

من ويكي الهندسة المعلوماتية
اذهب إلى: تصفح، ابحث

الفكرة العامة:


عادة كنا نستطيع الوصول من صف الابن إلى صف الأب وفق التتابع التالي :

point-circle-cylinder

circle is a point

point is not a cylinder

وبذلك استطعنا تكوين الفكرة التالية :

أغراض الصف المشتق تعالج تماماً كأغراض الصف الأساسي ومنه وجدنا العلاقات التالية :

1-مؤشر أب إلى صف الابن .

2-مؤشر الابن إلى صف الأب .

3-مؤشر الأب لصف الابن .

إلا أن العلاقة التالية غير مقبولة :

4-مؤشر الابن لصف الأب ...لو سألنا أنفسنا عن السبب الذي يجعلنا نرفض هذا النوع من العلاقات سنجد الإجابة واضحة وهي أن نمط الأب لا يمثل علاقة is a مع نمط الابن!!

أما العلاقة رقم 3 فيقبلها المترجم ولكن بشرط أن يستدعي مؤشر الأب الذي يؤشر على صف الابن توابع الأب فقط وإلا يعطي المترجم خطأً في الترجمة .

ونضيف بأن وجود مؤشر من نمط الأب على نمط الابن واستدعاء تابع من توابع الأب يؤدي لاستدعاء متحولات الأب لأجل الابن .

وهذا ما يقودنا للخلاصة التالية :

عند تعريف نمط مؤشر من الأب للابن فإن نمط هذا (المؤشر) هو الذي يحدد التوابع التي يجب استدعاؤها

ولكن ! ماذا لو أردنا أن يكون نمط الغرض هو الذي يحدد التوابع الواجب استدعاؤها وليس نمط المؤشر ؟

لهذا السبب وجدت التوابع الظاهرية virtual functions ويتم ذلك التتابع التالي :

1-تعريف التابع على أنه virtual ضمن صف الأب .

2-إعادة تعريف التابع نفسه ضمن صفوف الأبناء مع وضع virtual أيضاً (بإمكاننا عدم وضعها) بشرط أن يكون لهذه التوابع نفس توقيع التابع الأصلي في الأب .

تتميز التوابع الظاهرية بأنها dynamic binding أي يتم حل الاستدعاء الموجود ضمن الruntime وهذا ما يعاكس مفهوم الstatic binding الذي يعمل على معالجة الاستدعاءات ضمن الcompile time