‫لذلك في هذه المحاضرة ، سنتحدث عن الطريقة الافتراضية في C ++.
‫لقد رأيناها من قبل ، واستخدمناها ، لكن هل فهمناها تمامًا؟
‫دعونا نرى.
‫لذا فإن فكرة الطريقة الافتراضية هي أنها تتيح لنا تجاوز الوظائف في فئة أساسية.
‫لقد رأينا هذا بأشياء مثل البدء واللعب والتشنج اللاإرادي في Unreal ، لكن دعنا نتعمق في هذا الأمر ونفهم
‫سبب تمييزها على أنها افتراضية.
‫يسمح لنا بتغيير الوظائف في تلك الفئة الأساسية ، ويقوم بشيء يسمى Dynamic Dispatch ، والذي سنتحدث عنه بعد
‫ثانية لفهم ما يعنيه هذا حقًا ولماذا لا تعتبر الطرق الافتراضية هي الوظيفة الافتراضية
‫في C ++ كما هو الحال في العديد من اللغات الأخرى ، مثل C Sharp.
‫لذلك دعونا نلقي نظرة على هذا.
‫سأفعل هذا في موقع CPP dot S-H حتى لا نكون غير واقعيين هنا على الإطلاق.
‫نحن نبحث فقط في وظيفة C ++ الأولية حتى تتمكن من فهم ميزة اللغة هذه وكيفية
‫عملها.
‫الآن ، أول شيء سأفعله هنا هو المضي قدمًا وتوضيح الطريقة الرئيسية.
‫وفي حالة الاستخدام الخاصة بنا ، سنفكر في فصل البنادق ، نظرًا لأن هذه حالة استخدام شائعة
‫جدًا للألعاب.
‫لذلك دعونا نلقي نظرة على فصل يسمى البندقية بشكل مباشر إلى حد ما ، ومن ثم
‫سنجعل جسد هذا الفصل عامًا وطريقة إطلاق نار باطلة.
‫وسأمضي قدمًا وأعلن أن طريقة التصوير هذه متماشية هنا لإبقاء الأمور بسيطة
‫للغاية.
‫بالمناسبة ، يمكنك القيام بذلك إذا لم تكن قد رأيت هذا من قبل ، ولكن بشكل عام ، نريد القيام
‫بأشياء في ملف C ++ منفصل لإبقاء الأشياء منفصلة ، لجعل أوقات التجميع أسرع وما إلى ذلك.
‫ولكن هنا حيث يكون مجرد مثال على لعبة ، فهذا جيد ، لذلك سنقوم بإجراء اختبار STD C.
‫لذا ، باستخدام C ++ كمواد سلسلة ناتجة ، سنبدأ بشكل أساسي عندما نطلق على هذه الطريقة ثم ننتقل
‫إلى سطر النهاية.
‫وهذا هو جسمهم في طريقة التصوير لدينا.
‫ويمكننا إنهاء الفصل الدراسي باستخدام القوس المتعرج والفاصلة المنقوطة.
‫فلنبدأ استخدام هذه الفئة بالفعل.
‫سأقوم بإنشاء متغير بندقيتي بشكل رئيسي وسأطلق النار على مسدسي النقطي ودعنا نرى ما إذا كان كل
‫شيء يعمل هنا كما ينبغي.
‫اضغط على زر التشغيل وضرب.
‫إنها تستدعي الطريقة كما كنا نتوقع.
‫الآن ماذا يحدث إذا كنت أرغب في تمديد بندقيتي وربما صنع بندقية أو مسدسًا؟
‫لنسميها مسدس.
‫لذا فإن مسدس الطبقة هو موروث من البندقية ، والذي من شأنه أن يفعل مثل هذا.
‫وإذا لم تكن قد رأيت هذا من قبل لأنك ربما لم تكتب هذا بالضرورة من قبل ، فستقوم
‫بميراث عام من البنادق حتى تتمكن الفئات الأخرى من رؤية أنك ترث من السلاح.
‫ثم نقوم بذلك في القسم العام ، ربما نريد إنشاء طريقة إطلاق النار الخاصة بنا للمسدس الذي يتجاوز
‫هذه الوظيفة.
‫وبدلاً من طباعة الدوي في النهاية هنا ، نريد طباعة حبوب منع الحمل لأنها مسدس أصغر ، وهي تصدر
‫صوتًا أصغر وهذه طريقة التصوير لدينا هناك.
‫ودعونا نتوقف عن الفصل هناك.
‫وما نريد أن نفعله هو أن نصنع لأنفسنا مسدسًا.
‫لذلك مسدس مسدسي بالطريقة الرئيسية هنا.
‫ولأن هذه موجودة هنا ، في الطريقة الرئيسية ، فإننا لا نستخدم مؤشرات لها.
‫لهذا السبب نستخدم عامل التشغيل هنا بدلاً من السهم.
‫لذا فإن مسدسي لا يطلق النار.
‫دعونا نرى ماذا يفعل ذلك.
‫أتوقع أن تطبع PPU ، وهي تفعل ذلك.
‫رائع.
‫حسنًا ، لنحذف طريقتنا التي تستدعي.
‫قم بالتصوير مباشرة عليها ودعنا نرى كيف ستتصرف الأشياء بمؤشر.
‫لذلك سأقوم بإنشاء مؤشر بندقية يسمى Gun.
‫نفذ.
‫وفي السطر التالي يمكنني القيام بذلك على نفس السطر.
‫ولكن من أجل البساطة ، سأفعل ذلك في السطر التالي.
‫سأقوم بتعيين مؤشر البندقية هذا للإشارة إلى عنوان هذا هو عنوان المشغل
‫عنوان متغير بندقيتي.
‫ولأن هذا مؤشر ، نحتاج إلى استخدام عامل تشغيل السهم لاستدعاء طريقة التصوير.
‫لذلك سأطلق النار على مسدسي ، فلنضغط على تشغيل ونحصل على الضجة كنتيجة لذلك.
‫رائع.
‫الآن ماذا يحدث إذا فعلت نفس الشيء؟
‫لكن بدلاً من ضبط مؤشر البندقية للإشارة إلى مسدسي ، قمت بضبطه للإشارة إلى مسدسي.
‫دعنا نمضي قدمًا ونضرب الآن.
‫تمام.
‫هذا سلوك مثير للاهتمام هناك.
‫ما يحدث هنا هو استدعاء هذه الطريقة الأولى في كلتا الحالتين.
‫فلماذا لم يتم استدعاء طريقة التصوير الثانية هذه؟
‫لدينا مسدس هنا كمؤشر.
‫حسنًا ، ما يحدث إذا لم يكن لديك طريقة افتراضية هو أنه افتراضيًا ، سيستخدم C ++ نوع المؤشر
‫الخاص بك ، وهو مؤشر البندقية.
‫تذكر أنه سيستخدم هذا النوع للعثور على طريقة الاتصال.
‫لذلك سوف يذهب ويسمي طريقة التصوير هذه في الأعلى بدلاً من الطريقة التي تم تجاوزها في المسدس.
‫لكي تستدعي الطريقة التي تم تجاوزها والطريقة في المسدس ، يجب أن تسميها يجب أن
‫يكون لها مؤشر من نوع المسدس.
‫الآن هذا جيد.
‫ويمكنك أن ترى لماذا يفعلون ذلك.
‫إنه من أجل الكفاءة.
‫C ++ هو كل شيء عن الكفاءة.
‫إذا كان هناك شيء سيكلف أكثر عند تجميعه ، فعند تشغيله ، فلن تقوم C ++ بذلك افتراضيًا إلا
‫إذا طلبت ذلك.
‫لذلك من السهل جدًا على C ++ إجراء البحث والاستمرار ، حسنًا ، هذا مؤشر بندقية ، لذلك سأسمي طريقة
‫مؤشر البندقية.
‫وهنا يأتي دور Dynamic Dispatch.
‫هذا المصطلح الفاخر يعني في الأساس أننا لا نريده أن يفعل ذلك.
‫ما نريده أن يفعله هو أن نقول ، انتظر لحظة ، ما الذي تم تخزينه بالفعل في مؤشر البندقية هذا؟
‫ما هو النوع الحقيقي هناك؟
‫والنوع الحقيقي الذي ندركه هو أنه مسدس من النوع.
‫ولذا علينا أن نسأل أنفسنا ، هل هناك طريقة لهذا النوع تم تجاوزها؟
‫ونعم ، هناك.
‫إذن كيف نمنح C ++ الإذن بأن نكون أقل كفاءة قليلاً ونمنحنا القدرة على التجاوز
‫دون الحاجة إلى تغيير نوع المؤشر هذا ، وهو أمر غير ممكن دائمًا.
‫في الواقع ، في كثير من الحالات هذا غير ممكن ، كما هو الحال عندما يكون لديك فئة الممثلين المخصصة
‫الخاصة بك.
‫لا يحتوي Unreal على المؤشر الذي تم إعداده للإشارة إلى فئة الفعل الخاصة بك والتي قد تتطلب منهم تغيير المحرك
‫بالكامل في كل مرة تقوم فيها بتقديم فئة جديدة.
‫لا ، هذا غير ممكن.
‫لديهم مؤشر لشيء من نوع الممثل النجم.
‫لذلك عندما يتصلون ببدء اللعب ، فأنت تريد أن تسمي طريقة بدء اللعب.
‫لذلك يجب أن تكون افتراضية.
‫وهذا هو المفتاح هنا.
‫إذا تمسكنا افتراضيًا أمام الطريقة في الفصل الرئيسي ، فهذا يشير الآن إلى C ++ الذي يتم تعليقه في ثانية ، إذا
‫كنت أستدعي إطلاق النار على مؤشر من نوع البندقية ، فأنا بحاجة إلى التحقق من أن هذا ليس كذلك ، على سبيل
‫المثال ، مسدس وأن طريقة إطلاق النار هذه قد تم تجاوزها.
‫لذا إذا مضينا قدمًا وقمنا بالركض الآن ، يمكنك أن ترى أننا نحصل على دوي ثم حبوب منع الحمل.
‫لذا فهي تعمل كما كنا نتوقع مع Dynamic Dispatch.
‫وهذا هو المصطلح الخاص بهذا الشيء حيث نعني فقط التحقق من نوع النوع الذي يتم تثبيته بالفعل
‫في المؤشر واستدعاء الطريقة ذات الصلة.
‫يوجد الآن القليل من التركيب اللغوي الذي ستراه غالبًا على أنه استخدام وهذه هي الكلمة الأساسية للتجاوز.
‫وتضع ذلك بعد طريقة تحاول تجاوزها على أنها افتراضية.
‫وبصورة أساسية ، فإن الكلمة الرئيسية للتجاوز ليست ضرورية تمامًا ، كما أنها لا تضع افتراضية مرة أخرى ضد شيء ما
‫في فئة الأطفال الخاصة بالبندقية.
‫لذلك لا يتعين عليك وضع الوضع الافتراضي ، لكن القيام بذلك لن يضر.
‫لكن التجاوز مفيد بشكل خاص لأنه يسمح لنا فقط بالتأكد من صحة تسميتنا.
‫لذلك إذا قمت بالركض ، فإن كل شيء يسير كما كان من قبل عندما أتجاوز.
‫لكن لنفترض أنني أخطأت في فهم اسم هذه الطريقة ، لذا لا أفعل التجاوز.
‫وقد وصفته بأنه لا يوجد تبادل لإطلاق النار.
‫على سبيل المثال ، قمت بنسخ الاسم بشكل خاطئ.
‫لقد كتبته بدلاً من نسخه.
‫إذا قمت بالركض الآن ، ثم ترى ، لدينا نفس الخطأ مرة أخرى لأننا نحاول الاتصال لإطلاق النار.
‫لقد تجاوزناها عن طريق الخطأ بشكل غير صحيح.
‫انها الذهاب الانفجار ، فرقعة.
‫لذا فإن الطريقة التي يمكنني بها تجنب ذلك هي بالقول ، حسنًا ، أنا أحاول تجاوز شيء ما.
‫لذا أضع الكلمة الرئيسية للتجاوز هنا وإذا حاولت تجميعها الآن ، يمكنك أن ترى أنها تقول أن مطلق النار قد تم تمييزه
‫على أنه تجاوز ، ولكن لا توجد طريقة ، ولا توجد طريقة افتراضية لتجاوزها ، وفي هذه الحالة يمكنني الذهاب ، أوه
‫نعم ، لقد أخطأت في كتابة ذلك.
‫لذلك سأقوم بتصحيح الكود الخاص بي وأعده للتصوير.
‫والآن يعمل كما كنت أنوي.
‫لذلك فهي مجرد القليل من الأمان الإضافي من خلال وضع هذا التجاوز هناك وعلى الفور.
‫كما أنه يحمينا من الحالة التي يكون فيها الشيء الذي نحاول تجاوزه ليس افتراضيًا.
‫إذا حاولت القيام بذلك ، يمكنك أن ترى أنه تم وضع علامة على أنه تجاوز ، ولكن لا يتم تجاوز
‫ذلك لأن هذا الفصل الرئيسي لا يحتوي على وظيفة افتراضية للتصوير.
‫لذلك نأمل أن يكون هذا قد أعطاك إلى حد ما نظرة عامة على كيفية استخدام وتنفيذ C ++ للوظائف الافتراضية
‫ولماذا يجب أن نكون صريحين بشأنها.
‫الآن دعنا نفكر في بعض حالات الاستخدام الإضافية للوظائف الافتراضية بشكل عام.
‫لقد رأينا بالفعل البعض من المحرك.
‫أين رأيت استخدامًا افتراضيًا من قبل؟
‫أين يمكنك أن تتخيل استخدامه؟
‫لقد رأينا للتو مثالًا لحالة الاستخدام حيث قد يكون لديك مسدس وتجاوزات مختلفة لذلك تنفذ
‫إطلاق النار بطرق مختلفة.
‫وإلا كيف يمكنك أن تتخيل استخدام وظائف افتراضية تتجاوز الوظائف في فصول الآباء عندما فكرت
‫في إجابة لهذين السؤالين؟
‫اذهب واتبع رابط المناقشات في هذه المحاضرة وانشر إجابتك هناك.
‫حالات الاستخدام والأماكن التي استخدمتها من قبل واطلع على ما توصل إليه الآخرون.
‫ربما سيساعدك ذلك على ترسيخ فهمك للطرق الافتراضية.
‫هذا كل شيء في هذه المحاضرة.
‫سأراك في المرحلة التالية حيث سنستخدم الأساليب الافتراضية في الغضب.