﻿1
00:00:04,350 --> 00:00:09,720
‫لذلك في هذه المحاضرة ، سنتحدث عن الطريقة الافتراضية في C ++.

2
00:00:09,720 --> 00:00:13,170
‫لقد رأيناها من قبل ، واستخدمناها ، لكن هل فهمناها تمامًا؟

3
00:00:13,170 --> 00:00:14,100
‫دعونا نرى.

4
00:00:14,100 --> 00:00:20,460
‫لذا فإن فكرة الطريقة الافتراضية هي أنها تتيح لنا تجاوز الوظائف في فئة أساسية.

5
00:00:20,460 --> 00:00:27,210
‫لقد رأينا هذا بأشياء مثل البدء واللعب والتشنج اللاإرادي في Unreal ، لكن دعنا نتعمق في هذا الأمر ونفهم

6
00:00:27,210 --> 00:00:29,880
‫سبب تمييزها على أنها افتراضية.

7
00:00:29,880 --> 00:00:38,340
‫يسمح لنا بتغيير الوظائف في تلك الفئة الأساسية ، ويقوم بشيء يسمى Dynamic Dispatch ، والذي سنتحدث عنه بعد

8
00:00:38,340 --> 00:00:44,550
‫ثانية لفهم ما يعنيه هذا حقًا ولماذا لا تعتبر الطرق الافتراضية هي الوظيفة الافتراضية

9
00:00:44,550 --> 00:00:50,820
‫في C ++ كما هو الحال في العديد من اللغات الأخرى ، مثل C Sharp.

10
00:00:50,820 --> 00:00:52,320
‫لذلك دعونا نلقي نظرة على هذا.

11
00:00:52,440 --> 00:00:59,910
‫سأفعل هذا في موقع CPP dot S-H حتى لا نكون غير واقعيين هنا على الإطلاق.

12
00:00:59,910 --> 00:01:05,160
‫نحن نبحث فقط في وظيفة C ++ الأولية حتى تتمكن من فهم ميزة اللغة هذه وكيفية

13
00:01:05,160 --> 00:01:06,090
‫عملها.

14
00:01:06,150 --> 00:01:10,680
‫الآن ، أول شيء سأفعله هنا هو المضي قدمًا وتوضيح الطريقة الرئيسية.

15
00:01:10,680 --> 00:01:18,120
‫وفي حالة الاستخدام الخاصة بنا ، سنفكر في فصل البنادق ، نظرًا لأن هذه حالة استخدام شائعة

16
00:01:18,120 --> 00:01:19,680
‫جدًا للألعاب.

17
00:01:19,680 --> 00:01:26,760
‫لذلك دعونا نلقي نظرة على فصل يسمى البندقية بشكل مباشر إلى حد ما ، ومن ثم

18
00:01:26,760 --> 00:01:31,860
‫سنجعل جسد هذا الفصل عامًا وطريقة إطلاق نار باطلة.

19
00:01:32,520 --> 00:01:38,460
‫وسأمضي قدمًا وأعلن أن طريقة التصوير هذه متماشية هنا لإبقاء الأمور بسيطة

20
00:01:38,460 --> 00:01:39,310
‫للغاية.

21
00:01:39,330 --> 00:01:44,550
‫بالمناسبة ، يمكنك القيام بذلك إذا لم تكن قد رأيت هذا من قبل ، ولكن بشكل عام ، نريد القيام

22
00:01:44,550 --> 00:01:49,770
‫بأشياء في ملف C ++ منفصل لإبقاء الأشياء منفصلة ، لجعل أوقات التجميع أسرع وما إلى ذلك.

23
00:01:49,770 --> 00:01:55,290
‫ولكن هنا حيث يكون مجرد مثال على لعبة ، فهذا جيد ، لذلك سنقوم بإجراء اختبار STD C.

24
00:01:55,290 --> 00:02:03,390
‫لذا ، باستخدام C ++ كمواد سلسلة ناتجة ، سنبدأ بشكل أساسي عندما نطلق على هذه الطريقة ثم ننتقل

25
00:02:03,390 --> 00:02:04,980
‫إلى سطر النهاية.

26
00:02:05,570 --> 00:02:07,850
‫وهذا هو جسمهم في طريقة التصوير لدينا.

27
00:02:07,850 --> 00:02:11,720
‫ويمكننا إنهاء الفصل الدراسي باستخدام القوس المتعرج والفاصلة المنقوطة.

28
00:02:11,960 --> 00:02:14,750
‫فلنبدأ استخدام هذه الفئة بالفعل.

29
00:02:14,750 --> 00:02:23,510
‫سأقوم بإنشاء متغير بندقيتي بشكل رئيسي وسأطلق النار على مسدسي النقطي ودعنا نرى ما إذا كان كل

30
00:02:23,510 --> 00:02:25,910
‫شيء يعمل هنا كما ينبغي.

31
00:02:25,940 --> 00:02:28,070
‫اضغط على زر التشغيل وضرب.

32
00:02:28,160 --> 00:02:30,530
‫إنها تستدعي الطريقة كما كنا نتوقع.

33
00:02:30,980 --> 00:02:39,470
‫الآن ماذا يحدث إذا كنت أرغب في تمديد بندقيتي وربما صنع بندقية أو مسدسًا؟

34
00:02:39,470 --> 00:02:40,420
‫لنسميها مسدس.

35
00:02:40,430 --> 00:02:47,180
‫لذا فإن مسدس الطبقة هو موروث من البندقية ، والذي من شأنه أن يفعل مثل هذا.

36
00:02:47,180 --> 00:02:51,530
‫وإذا لم تكن قد رأيت هذا من قبل لأنك ربما لم تكتب هذا بالضرورة من قبل ، فستقوم

37
00:02:51,530 --> 00:02:56,330
‫بميراث عام من البنادق حتى تتمكن الفئات الأخرى من رؤية أنك ترث من السلاح.

38
00:02:56,600 --> 00:03:04,280
‫ثم نقوم بذلك في القسم العام ، ربما نريد إنشاء طريقة إطلاق النار الخاصة بنا للمسدس الذي يتجاوز

39
00:03:04,280 --> 00:03:05,540
‫هذه الوظيفة.

40
00:03:05,540 --> 00:03:13,220
‫وبدلاً من طباعة الدوي في النهاية هنا ، نريد طباعة حبوب منع الحمل لأنها مسدس أصغر ، وهي تصدر

41
00:03:13,220 --> 00:03:17,420
‫صوتًا أصغر وهذه طريقة التصوير لدينا هناك.

42
00:03:17,420 --> 00:03:20,150
‫ودعونا نتوقف عن الفصل هناك.

43
00:03:20,360 --> 00:03:23,300
‫وما نريد أن نفعله هو أن نصنع لأنفسنا مسدسًا.

44
00:03:23,300 --> 00:03:28,010
‫لذلك مسدس مسدسي بالطريقة الرئيسية هنا.

45
00:03:28,670 --> 00:03:34,010
‫ولأن هذه موجودة هنا ، في الطريقة الرئيسية ، فإننا لا نستخدم مؤشرات لها.

46
00:03:34,010 --> 00:03:38,450
‫لهذا السبب نستخدم عامل التشغيل هنا بدلاً من السهم.

47
00:03:38,750 --> 00:03:42,260
‫لذا فإن مسدسي لا يطلق النار.

48
00:03:42,260 --> 00:03:43,460
‫دعونا نرى ماذا يفعل ذلك.

49
00:03:43,610 --> 00:03:47,280
‫أتوقع أن تطبع PPU ، وهي تفعل ذلك.

50
00:03:47,300 --> 00:03:47,930
‫رائع.

51
00:03:48,260 --> 00:03:51,530
‫حسنًا ، لنحذف طريقتنا التي تستدعي.

52
00:03:51,530 --> 00:03:57,050
‫قم بالتصوير مباشرة عليها ودعنا نرى كيف ستتصرف الأشياء بمؤشر.

53
00:03:57,290 --> 00:04:01,880
‫لذلك سأقوم بإنشاء مؤشر بندقية يسمى Gun.

54
00:04:02,660 --> 00:04:03,640
‫نفذ.

55
00:04:04,570 --> 00:04:06,910
‫وفي السطر التالي يمكنني القيام بذلك على نفس السطر.

56
00:04:06,910 --> 00:04:08,890
‫ولكن من أجل البساطة ، سأفعل ذلك في السطر التالي.

57
00:04:08,890 --> 00:04:15,790
‫سأقوم بتعيين مؤشر البندقية هذا للإشارة إلى عنوان هذا هو عنوان المشغل

58
00:04:15,790 --> 00:04:18,310
‫عنوان متغير بندقيتي.

59
00:04:18,580 --> 00:04:23,830
‫ولأن هذا مؤشر ، نحتاج إلى استخدام عامل تشغيل السهم لاستدعاء طريقة التصوير.

60
00:04:23,830 --> 00:04:30,400
‫لذلك سأطلق النار على مسدسي ، فلنضغط على تشغيل ونحصل على الضجة كنتيجة لذلك.

61
00:04:30,400 --> 00:04:31,120
‫رائع.

62
00:04:31,210 --> 00:04:34,450
‫الآن ماذا يحدث إذا فعلت نفس الشيء؟

63
00:04:34,450 --> 00:04:40,840
‫لكن بدلاً من ضبط مؤشر البندقية للإشارة إلى مسدسي ، قمت بضبطه للإشارة إلى مسدسي.

64
00:04:40,990 --> 00:04:42,550
‫دعنا نمضي قدمًا ونضرب الآن.

65
00:04:42,880 --> 00:04:43,240
‫تمام.

66
00:04:43,240 --> 00:04:45,190
‫هذا سلوك مثير للاهتمام هناك.

67
00:04:45,190 --> 00:04:51,880
‫ما يحدث هنا هو استدعاء هذه الطريقة الأولى في كلتا الحالتين.

68
00:04:51,880 --> 00:04:55,510
‫فلماذا لم يتم استدعاء طريقة التصوير الثانية هذه؟

69
00:04:55,510 --> 00:04:58,030
‫لدينا مسدس هنا كمؤشر.

70
00:04:58,300 --> 00:05:05,500
‫حسنًا ، ما يحدث إذا لم يكن لديك طريقة افتراضية هو أنه افتراضيًا ، سيستخدم C ++ نوع المؤشر

71
00:05:05,500 --> 00:05:07,960
‫الخاص بك ، وهو مؤشر البندقية.

72
00:05:07,960 --> 00:05:11,890
‫تذكر أنه سيستخدم هذا النوع للعثور على طريقة الاتصال.

73
00:05:11,890 --> 00:05:18,130
‫لذلك سوف يذهب ويسمي طريقة التصوير هذه في الأعلى بدلاً من الطريقة التي تم تجاوزها في المسدس.

74
00:05:18,130 --> 00:05:23,530
‫لكي تستدعي الطريقة التي تم تجاوزها والطريقة في المسدس ، يجب أن تسميها يجب أن

75
00:05:23,530 --> 00:05:25,630
‫يكون لها مؤشر من نوع المسدس.

76
00:05:25,960 --> 00:05:27,520
‫الآن هذا جيد.

77
00:05:27,520 --> 00:05:29,350
‫ويمكنك أن ترى لماذا يفعلون ذلك.

78
00:05:29,350 --> 00:05:30,430
‫إنه من أجل الكفاءة.

79
00:05:30,430 --> 00:05:32,410
‫C ++ هو كل شيء عن الكفاءة.

80
00:05:32,410 --> 00:05:39,250
‫إذا كان هناك شيء سيكلف أكثر عند تجميعه ، فعند تشغيله ، فلن تقوم C ++ بذلك افتراضيًا إلا

81
00:05:39,250 --> 00:05:40,600
‫إذا طلبت ذلك.

82
00:05:40,630 --> 00:05:46,270
‫لذلك من السهل جدًا على C ++ إجراء البحث والاستمرار ، حسنًا ، هذا مؤشر بندقية ، لذلك سأسمي طريقة

83
00:05:46,270 --> 00:05:47,620
‫مؤشر البندقية.

84
00:05:47,620 --> 00:05:50,080
‫وهنا يأتي دور Dynamic Dispatch.

85
00:05:50,080 --> 00:05:54,070
‫هذا المصطلح الفاخر يعني في الأساس أننا لا نريده أن يفعل ذلك.

86
00:05:54,070 --> 00:05:59,950
‫ما نريده أن يفعله هو أن نقول ، انتظر لحظة ، ما الذي تم تخزينه بالفعل في مؤشر البندقية هذا؟

87
00:05:59,950 --> 00:06:02,140
‫ما هو النوع الحقيقي هناك؟

88
00:06:02,380 --> 00:06:06,250
‫والنوع الحقيقي الذي ندركه هو أنه مسدس من النوع.

89
00:06:06,250 --> 00:06:12,520
‫ولذا علينا أن نسأل أنفسنا ، هل هناك طريقة لهذا النوع تم تجاوزها؟

90
00:06:12,520 --> 00:06:13,600
‫ونعم ، هناك.

91
00:06:13,600 --> 00:06:20,230
‫إذن كيف نمنح C ++ الإذن بأن نكون أقل كفاءة قليلاً ونمنحنا القدرة على التجاوز

92
00:06:20,230 --> 00:06:26,110
‫دون الحاجة إلى تغيير نوع المؤشر هذا ، وهو أمر غير ممكن دائمًا.

93
00:06:26,110 --> 00:06:31,690
‫في الواقع ، في كثير من الحالات هذا غير ممكن ، كما هو الحال عندما يكون لديك فئة الممثلين المخصصة

94
00:06:31,690 --> 00:06:32,470
‫الخاصة بك.

95
00:06:32,590 --> 00:06:38,290
‫لا يحتوي Unreal على المؤشر الذي تم إعداده للإشارة إلى فئة الفعل الخاصة بك والتي قد تتطلب منهم تغيير المحرك

96
00:06:38,290 --> 00:06:41,290
‫بالكامل في كل مرة تقوم فيها بتقديم فئة جديدة.

97
00:06:41,290 --> 00:06:43,120
‫لا ، هذا غير ممكن.

98
00:06:43,120 --> 00:06:46,360
‫لديهم مؤشر لشيء من نوع الممثل النجم.

99
00:06:46,360 --> 00:06:51,010
‫لذلك عندما يتصلون ببدء اللعب ، فأنت تريد أن تسمي طريقة بدء اللعب.

100
00:06:51,010 --> 00:06:52,630
‫لذلك يجب أن تكون افتراضية.

101
00:06:52,630 --> 00:06:54,340
‫وهذا هو المفتاح هنا.

102
00:06:54,340 --> 00:07:02,500
‫إذا تمسكنا افتراضيًا أمام الطريقة في الفصل الرئيسي ، فهذا يشير الآن إلى C ++ الذي يتم تعليقه في ثانية ، إذا

103
00:07:02,500 --> 00:07:10,120
‫كنت أستدعي إطلاق النار على مؤشر من نوع البندقية ، فأنا بحاجة إلى التحقق من أن هذا ليس كذلك ، على سبيل

104
00:07:10,120 --> 00:07:14,350
‫المثال ، مسدس وأن طريقة إطلاق النار هذه قد تم تجاوزها.

105
00:07:14,350 --> 00:07:19,390
‫لذا إذا مضينا قدمًا وقمنا بالركض الآن ، يمكنك أن ترى أننا نحصل على دوي ثم حبوب منع الحمل.

106
00:07:19,420 --> 00:07:24,070
‫لذا فهي تعمل كما كنا نتوقع مع Dynamic Dispatch.

107
00:07:24,070 --> 00:07:30,370
‫وهذا هو المصطلح الخاص بهذا الشيء حيث نعني فقط التحقق من نوع النوع الذي يتم تثبيته بالفعل

108
00:07:30,370 --> 00:07:33,430
‫في المؤشر واستدعاء الطريقة ذات الصلة.

109
00:07:33,940 --> 00:07:40,450
‫يوجد الآن القليل من التركيب اللغوي الذي ستراه غالبًا على أنه استخدام وهذه هي الكلمة الأساسية للتجاوز.

110
00:07:40,450 --> 00:07:45,520
‫وتضع ذلك بعد طريقة تحاول تجاوزها على أنها افتراضية.

111
00:07:45,790 --> 00:07:53,680
‫وبصورة أساسية ، فإن الكلمة الرئيسية للتجاوز ليست ضرورية تمامًا ، كما أنها لا تضع افتراضية مرة أخرى ضد شيء ما

112
00:07:53,680 --> 00:07:56,200
‫في فئة الأطفال الخاصة بالبندقية.

113
00:07:56,200 --> 00:07:59,350
‫لذلك لا يتعين عليك وضع الوضع الافتراضي ، لكن القيام بذلك لن يضر.

114
00:07:59,560 --> 00:08:07,030
‫لكن التجاوز مفيد بشكل خاص لأنه يسمح لنا فقط بالتأكد من صحة تسميتنا.

115
00:08:07,030 --> 00:08:10,690
‫لذلك إذا قمت بالركض ، فإن كل شيء يسير كما كان من قبل عندما أتجاوز.

116
00:08:10,690 --> 00:08:17,290
‫لكن لنفترض أنني أخطأت في فهم اسم هذه الطريقة ، لذا لا أفعل التجاوز.

117
00:08:17,290 --> 00:08:19,490
‫وقد وصفته بأنه لا يوجد تبادل لإطلاق النار.

118
00:08:19,870 --> 00:08:22,750
‫على سبيل المثال ، قمت بنسخ الاسم بشكل خاطئ.

119
00:08:22,750 --> 00:08:24,520
‫لقد كتبته بدلاً من نسخه.

120
00:08:24,520 --> 00:08:29,230
‫إذا قمت بالركض الآن ، ثم ترى ، لدينا نفس الخطأ مرة أخرى لأننا نحاول الاتصال لإطلاق النار.

121
00:08:29,230 --> 00:08:32,350
‫لقد تجاوزناها عن طريق الخطأ بشكل غير صحيح.

122
00:08:32,350 --> 00:08:33,820
‫انها الذهاب الانفجار ، فرقعة.

123
00:08:33,910 --> 00:08:37,840
‫لذا فإن الطريقة التي يمكنني بها تجنب ذلك هي بالقول ، حسنًا ، أنا أحاول تجاوز شيء ما.

124
00:08:37,840 --> 00:08:44,170
‫لذا أضع الكلمة الرئيسية للتجاوز هنا وإذا حاولت تجميعها الآن ، يمكنك أن ترى أنها تقول أن مطلق النار قد تم تمييزه

125
00:08:44,170 --> 00:08:50,260
‫على أنه تجاوز ، ولكن لا توجد طريقة ، ولا توجد طريقة افتراضية لتجاوزها ، وفي هذه الحالة يمكنني الذهاب ، أوه

126
00:08:50,260 --> 00:08:52,360
‫نعم ، لقد أخطأت في كتابة ذلك.

127
00:08:52,360 --> 00:08:57,340
‫لذلك سأقوم بتصحيح الكود الخاص بي وأعده للتصوير.

128
00:08:57,340 --> 00:08:59,320
‫والآن يعمل كما كنت أنوي.

129
00:08:59,320 --> 00:09:04,150
‫لذلك فهي مجرد القليل من الأمان الإضافي من خلال وضع هذا التجاوز هناك وعلى الفور.

130
00:09:04,240 --> 00:09:09,170
‫كما أنه يحمينا من الحالة التي يكون فيها الشيء الذي نحاول تجاوزه ليس افتراضيًا.

131
00:09:09,190 --> 00:09:14,680
‫إذا حاولت القيام بذلك ، يمكنك أن ترى أنه تم وضع علامة على أنه تجاوز ، ولكن لا يتم تجاوز

132
00:09:14,680 --> 00:09:19,410
‫ذلك لأن هذا الفصل الرئيسي لا يحتوي على وظيفة افتراضية للتصوير.

133
00:09:19,420 --> 00:09:25,570
‫لذلك نأمل أن يكون هذا قد أعطاك إلى حد ما نظرة عامة على كيفية استخدام وتنفيذ C ++ للوظائف الافتراضية

134
00:09:25,570 --> 00:09:28,330
‫ولماذا يجب أن نكون صريحين بشأنها.

135
00:09:28,600 --> 00:09:32,890
‫الآن دعنا نفكر في بعض حالات الاستخدام الإضافية للوظائف الافتراضية بشكل عام.

136
00:09:32,890 --> 00:09:34,750
‫لقد رأينا بالفعل البعض من المحرك.

137
00:09:34,750 --> 00:09:37,630
‫أين رأيت استخدامًا افتراضيًا من قبل؟

138
00:09:38,450 --> 00:09:40,190
‫أين يمكنك أن تتخيل استخدامه؟

139
00:09:40,220 --> 00:09:45,110
‫لقد رأينا للتو مثالًا لحالة الاستخدام حيث قد يكون لديك مسدس وتجاوزات مختلفة لذلك تنفذ

140
00:09:45,110 --> 00:09:46,880
‫إطلاق النار بطرق مختلفة.

141
00:09:47,300 --> 00:09:53,630
‫وإلا كيف يمكنك أن تتخيل استخدام وظائف افتراضية تتجاوز الوظائف في فصول الآباء عندما فكرت

142
00:09:53,630 --> 00:09:55,530
‫في إجابة لهذين السؤالين؟

143
00:09:55,550 --> 00:10:01,290
‫اذهب واتبع رابط المناقشات في هذه المحاضرة وانشر إجابتك هناك.

144
00:10:01,310 --> 00:10:06,010
‫حالات الاستخدام والأماكن التي استخدمتها من قبل واطلع على ما توصل إليه الآخرون.

145
00:10:06,020 --> 00:10:11,250
‫ربما سيساعدك ذلك على ترسيخ فهمك للطرق الافتراضية.

146
00:10:11,270 --> 00:10:12,280
‫هذا كل شيء في هذه المحاضرة.

147
00:10:12,290 --> 00:10:15,710
‫سأراك في المرحلة التالية حيث سنستخدم الأساليب الافتراضية في الغضب.

