﻿1
00:00:04,350 --> 00:00:09,720
‫Vì vậy, trong bài giảng này, chúng ta sẽ nói về phương thức ảo trong C ++.

2
00:00:09,720 --> 00:00:13,170
‫Chúng ta đã thấy nó trước đây, chúng ta đã sử dụng nó, nhưng chúng ta đã hiểu hết về nó chưa?

3
00:00:13,170 --> 00:00:14,100
‫Hãy xem nào.

4
00:00:14,100 --> 00:00:20,460
‫Vì vậy, ý tưởng của phương thức ảo là nó cho phép chúng ta ghi đè các hàm trong một lớp cơ sở.

5
00:00:20,460 --> 00:00:27,210
‫Chúng tôi đã thấy điều này với những thứ như bắt đầu, chơi và tic trong Unreal, nhưng hãy đi sâu hơn vào điều này và

6
00:00:27,210 --> 00:00:29,880
‫hiểu tại sao chúng được đánh dấu là ảo.

7
00:00:29,880 --> 00:00:38,340
‫Nó cho phép chúng ta thay đổi chức năng trong lớp cơ sở đó và nó thực hiện một cái gì đó gọi là Dynamic Dispatch, mà chúng ta sẽ

8
00:00:38,340 --> 00:00:44,550
‫nói trong giây lát để hiểu điều này thực sự có nghĩa là gì và tại sao các phương thức ảo

9
00:00:44,550 --> 00:00:50,820
‫không phải là chức năng mặc định trong C ++ vì chúng có trong nhiều ngôn ngữ khác, chẳng hạn như C Sharp.

10
00:00:50,820 --> 00:00:52,320
‫Vì vậy, chúng ta hãy xem xét điều này.

11
00:00:52,440 --> 00:00:59,910
‫Tôi sẽ làm điều này trên trang web CPP dot S-H để chúng tôi không ở trong Unreal ở đây chút nào.

12
00:00:59,910 --> 00:01:05,160
‫Chúng tôi chỉ xem xét chức năng thô của C ++ để bạn có thể hiểu tính năng ngôn ngữ này và cách

13
00:01:05,160 --> 00:01:06,090
‫nó hoạt động.

14
00:01:06,150 --> 00:01:10,680
‫Bây giờ, điều đầu tiên tôi sẽ làm ở đây là tiếp tục và tìm ra phương pháp chính.

15
00:01:10,680 --> 00:01:18,120
‫Và trong trường hợp sử dụng của chúng tôi, chúng tôi sẽ nghĩ về một lớp cho súng, vì đây là trường hợp sử dụng rất phổ

16
00:01:18,120 --> 00:01:19,680
‫biến cho các trò chơi.

17
00:01:19,680 --> 00:01:26,760
‫Vì vậy, chúng ta hãy xem xét một lớp được gọi là nó khá đơn giản và sau đó chúng ta sẽ đặt phần

18
00:01:26,760 --> 00:01:31,860
‫thân của lớp này ở chế độ công khai và một phương pháp bắn vô hiệu.

19
00:01:32,520 --> 00:01:38,460
‫Và tôi sẽ tiếp tục và khai báo nội dung của phương pháp chụp này ngay sau đây để giữ cho mọi thứ trở nên cực

20
00:01:38,460 --> 00:01:39,310
‫kỳ đơn giản.

21
00:01:39,330 --> 00:01:44,550
‫Nhân tiện, bạn có thể làm điều này nếu bạn chưa thấy điều này trước đây, nhưng nói chung, chúng tôi muốn thực hiện

22
00:01:44,550 --> 00:01:49,470
‫mọi thứ trong một tệp C ++ riêng biệt để giữ mọi thứ riêng biệt, giúp thời gian biên dịch nhanh hơn,

23
00:01:49,470 --> 00:01:49,770
‫v.v.

24
00:01:49,770 --> 00:01:55,290
‫Nhưng ở đây nó chỉ là một ví dụ đồ chơi, điều này là tốt, vì vậy chúng tôi sẽ làm một cuộc kiểm tra STD C.

25
00:01:55,290 --> 00:02:03,390
‫Vì vậy, sử dụng C ++ làm nội dung chuỗi đầu ra và chúng ta sẽ đi về cơ bản khi chúng ta gọi phương thức này và sau đó chúng

26
00:02:03,390 --> 00:02:04,980
‫ta sẽ kết thúc dòng.

27
00:02:05,570 --> 00:02:07,850
‫Và đó là phần thân của phương pháp chụp của chúng tôi.

28
00:02:07,850 --> 00:02:11,720
‫Và chúng ta có thể giới hạn lớp bằng dấu ngoặc nhọn và dấu chấm phẩy.

29
00:02:11,960 --> 00:02:14,750
‫Vì vậy, hãy tiếp tục và thực sự sử dụng lớp này.

30
00:02:14,750 --> 00:02:23,510
‫Tôi sẽ tạo một biến súng của mình trong chính và tôi sẽ gọi súng chấm bắn và hãy xem mọi thứ ở đây có

31
00:02:23,510 --> 00:02:25,910
‫hoạt động như bình thường không.

32
00:02:25,940 --> 00:02:28,070
‫Nhấn nút chạy và nổ.

33
00:02:28,160 --> 00:02:30,530
‫Nó đang gọi phương thức như chúng ta mong đợi.

34
00:02:30,980 --> 00:02:39,470
‫Bây giờ điều gì sẽ xảy ra nếu tôi muốn mở rộng khẩu súng của mình và có thể chế tạo một khẩu súng trường hoặc súng lục?

35
00:02:39,470 --> 00:02:40,420
‫Hãy gọi nó là một khẩu súng lục.

36
00:02:40,430 --> 00:02:47,180
‫Vì vậy, súng lục đẳng cấp là một loại súng kế thừa từ súng, sẽ làm như thế này.

37
00:02:47,180 --> 00:02:51,530
‫Và nếu bạn chưa từng thấy điều này trước đây vì có thể bạn chưa viết điều này nhất thiết trước

38
00:02:51,530 --> 00:02:56,330
‫đây, bạn sẽ thực hiện kế thừa công khai từ súng để các lớp khác có thể thấy rằng bạn thừa kế từ súng.

39
00:02:56,600 --> 00:03:04,280
‫Và sau đó chúng tôi thực hiện trong phần công khai, chúng tôi muốn có thể tạo ra phương pháp bắn của riêng mình cho khẩu súng lục ghi

40
00:03:04,280 --> 00:03:05,540
‫đè chức năng này.

41
00:03:05,540 --> 00:03:13,220
‫Và thay vì in tiếng nổ ở cuối ở đây, chúng tôi muốn in viên thuốc vì nó là một khẩu súng nhỏ hơn, nó tạo ra âm

42
00:03:13,220 --> 00:03:17,420
‫thanh nhỏ hơn và đó là phương pháp bắn của chúng tôi ở đó.

43
00:03:17,420 --> 00:03:20,150
‫Và chúng ta hãy giới thiệu lớp học ở đó.

44
00:03:20,360 --> 00:03:23,300
‫Và những gì chúng tôi muốn làm là tạo ra cho mình một khẩu súng lục.

45
00:03:23,300 --> 00:03:28,010
‫Vì vậy, súng lục khẩu súng lục của tôi trong phương pháp chính ở đây.

46
00:03:28,670 --> 00:03:34,010
‫Và bởi vì chúng chỉ tồn tại ở đây, ngay trên phương thức chính, chúng tôi không sử dụng con trỏ tới chúng.

47
00:03:34,010 --> 00:03:38,450
‫Đó là lý do tại sao chúng tôi đang sử dụng toán tử bắn ở đây thay vì mũi tên.

48
00:03:38,750 --> 00:03:42,260
‫Vì vậy, khẩu súng lục của tôi không bắn.

49
00:03:42,260 --> 00:03:43,460
‫Hãy xem điều đó làm gì.

50
00:03:43,610 --> 00:03:47,280
‫Tôi hy vọng nó sẽ in PPU, mà nó có.

51
00:03:47,300 --> 00:03:47,930
‫Mát mẻ.

52
00:03:48,260 --> 00:03:51,530
‫Được rồi, hãy xóa các phương thức đang gọi của chúng tôi.

53
00:03:51,530 --> 00:03:57,050
‫Hãy quay trực tiếp vào những thứ này và chúng ta hãy xem mọi thứ sẽ hoạt động như thế nào với một con trỏ.

54
00:03:57,290 --> 00:04:01,880
‫Vì vậy, tôi sẽ tạo một con trỏ súng có tên là Gun.

55
00:04:02,660 --> 00:04:03,640
‫Peter.

56
00:04:04,570 --> 00:04:06,910
‫Và trên dòng tiếp theo, tôi có thể làm điều đó trên cùng một dòng.

57
00:04:06,910 --> 00:04:08,890
‫Nhưng vì lý do đơn giản, tôi sẽ làm điều đó ở dòng tiếp theo.

58
00:04:08,890 --> 00:04:15,790
‫Tôi sẽ đặt con trỏ súng đó trỏ đến địa chỉ của đó là địa chỉ của nhà điều hành,

59
00:04:15,790 --> 00:04:18,310
‫địa chỉ của biến súng của tôi.

60
00:04:18,580 --> 00:04:23,830
‫Và vì đây là một con trỏ, chúng ta cần sử dụng toán tử mũi tên để gọi phương thức bắn.

61
00:04:23,830 --> 00:04:30,400
‫Vì vậy, tôi sẽ gọi là bắn vào súng của mình, hãy nhấp vào chạy và kết quả là chúng ta sẽ nổ ở đó.

62
00:04:30,400 --> 00:04:31,120
‫Mát mẻ.

63
00:04:31,210 --> 00:04:34,450
‫Bây giờ điều gì sẽ xảy ra nếu tôi làm điều tương tự?

64
00:04:34,450 --> 00:04:40,840
‫Nhưng thay vì đặt con trỏ súng chỉ vào súng của tôi, tôi đặt nó trỏ vào khẩu súng lục của mình.

65
00:04:40,990 --> 00:04:42,550
‫Hãy tiếp tục và nhấn chạy ngay bây giờ.

66
00:04:42,880 --> 00:04:43,240
‫Được chứ.

67
00:04:43,240 --> 00:04:45,190
‫Đó là một hành vi thú vị ở đó.

68
00:04:45,190 --> 00:04:51,880
‫Điều đang xảy ra ở đây là nó đang gọi phương thức đầu tiên này trong cả hai trường hợp.

69
00:04:51,880 --> 00:04:55,510
‫Vậy tại sao phương pháp chụp thứ hai này vẫn chưa được gọi là?

70
00:04:55,510 --> 00:04:58,030
‫Chúng tôi có một khẩu súng lục ở đây làm kim chỉ nam.

71
00:04:58,300 --> 00:05:05,500
‫Điều gì sẽ xảy ra nếu bạn không có phương thức ảo là theo mặc định, C ++ sẽ sử dụng loại con trỏ

72
00:05:05,500 --> 00:05:07,960
‫của bạn, đây là con trỏ súng.

73
00:05:07,960 --> 00:05:11,890
‫Hãy nhớ rằng, nó sẽ sử dụng kiểu đó để tìm phương thức cần gọi.

74
00:05:11,890 --> 00:05:18,130
‫Vì vậy, nó sẽ đi và gọi phương pháp bắn này ở trên cùng chứ không phải là phương pháp ghi đè trong súng lục.

75
00:05:18,130 --> 00:05:23,530
‫Để nó gọi được ghi đè và phương thức trong súng lục, nó sẽ phải gọi nó sẽ phải có

76
00:05:23,530 --> 00:05:25,630
‫một con trỏ của loại súng lục.

77
00:05:25,960 --> 00:05:27,520
‫Bây giờ thì tốt rồi.

78
00:05:27,520 --> 00:05:29,350
‫Và bạn có thể thấy tại sao họ làm điều này.

79
00:05:29,350 --> 00:05:30,430
‫Nó cho hiệu quả.

80
00:05:30,430 --> 00:05:32,410
‫C ++ là tất cả về hiệu quả.

81
00:05:32,410 --> 00:05:39,250
‫Nếu một cái gì đó sẽ tốn kém hơn khi nó được biên dịch, khi nó chạy, thì C ++ sẽ không làm điều đó theo mặc định

82
00:05:39,250 --> 00:05:40,600
‫trừ khi bạn yêu cầu.

83
00:05:40,630 --> 00:05:46,270
‫Vì vậy, rất dễ dàng để C ++ thực hiện tra cứu và sử dụng, Đây là một con trỏ súng, vì vậy tôi sẽ gọi phương

84
00:05:46,270 --> 00:05:47,620
‫thức này là con trỏ súng.

85
00:05:47,620 --> 00:05:50,080
‫Và đây là lúc Dynamic Dispatch vào cuộc.

86
00:05:50,080 --> 00:05:54,070
‫Thuật ngữ ưa thích này về cơ bản có nghĩa là chúng tôi không muốn nó làm điều đó.

87
00:05:54,070 --> 00:05:59,950
‫Những gì chúng tôi muốn nó làm là nói, Chờ một chút, thứ gì thực sự được lưu trữ trong khẩu súng đó?

88
00:05:59,950 --> 00:06:02,140
‫Loại thực sự ở đó là gì?

89
00:06:02,380 --> 00:06:06,250
‫Và loại thực sự mà chúng tôi nhận ra là một loại súng lục.

90
00:06:06,250 --> 00:06:12,520
‫Và vì vậy chúng ta phải tự hỏi mình, có phương pháp nào cho kiểu bị ghi đè đó không?

91
00:06:12,520 --> 00:06:13,600
‫Và có, có.

92
00:06:13,600 --> 00:06:20,230
‫Vì vậy, làm thế nào để chúng tôi cấp cho C ++ quyền để chỉ kém hiệu quả hơn một chút và cung cấp cho chúng tôi

93
00:06:20,230 --> 00:06:26,110
‫khả năng ghi đè mà không cần phải thay đổi loại con trỏ đó, điều này không nhất thiết phải luôn khả thi.

94
00:06:26,110 --> 00:06:31,690
‫Trên thực tế, trong nhiều trường hợp, điều này là không thể, như trường hợp bạn đang có lớp diễn viên tùy chỉnh

95
00:06:31,690 --> 00:06:32,470
‫của riêng mình.

96
00:06:32,590 --> 00:06:38,290
‫Unreal không có con trỏ được thiết lập để trỏ đến lớp hành động cụ thể của bạn mà sẽ yêu cầu họ thay đổi

97
00:06:38,290 --> 00:06:41,290
‫toàn bộ động cơ mỗi khi bạn giới thiệu một lớp mới.

98
00:06:41,290 --> 00:06:43,120
‫Không, điều đó là không thể.

99
00:06:43,120 --> 00:06:46,360
‫Họ có một con trỏ đến một cái gì đó của loại diễn viên ngôi sao.

100
00:06:46,360 --> 00:06:51,010
‫Vì vậy, khi họ gọi bắt đầu chơi, bạn muốn nó gọi phương pháp bắt đầu chơi của bạn.

101
00:06:51,010 --> 00:06:52,630
‫Vì vậy, nó phải là ảo.

102
00:06:52,630 --> 00:06:54,340
‫Và đó là chìa khóa ở đây.

103
00:06:54,340 --> 00:07:02,500
‫Nếu chúng ta gắn ảo trước phương thức trong lớp cha, điều này hiện

104
00:07:02,500 --> 00:07:10,120
‫báo hiệu cho C ++. , một khẩu súng lục và phương pháp

105
00:07:10,120 --> 00:07:14,350
‫bắn này đã bị ghi đè.

106
00:07:14,350 --> 00:07:19,390
‫Vì vậy, nếu chúng tôi tiếp tục và nhấn run ngay bây giờ, bạn có thể thấy chúng tôi bị nổ và sau đó là viên thuốc.

107
00:07:19,420 --> 00:07:24,070
‫Vì vậy, nó đang hoạt động như chúng tôi mong đợi với Dynamic Dispatch.

108
00:07:24,070 --> 00:07:30,370
‫Và đó là thuật ngữ cho điều này mà về cơ bản, chúng tôi chỉ muốn kiểm tra loại kiểu này thực sự đang được

109
00:07:30,370 --> 00:07:33,430
‫giữ trong con trỏ và gọi phương thức có liên quan.

110
00:07:33,940 --> 00:07:40,450
‫Bây giờ có thêm một chút cú pháp mà bạn thường thấy khi sử dụng và đó là từ khóa ghi đè.

111
00:07:40,450 --> 00:07:45,520
‫Và bạn đặt nó sau một phương thức mà bạn đang cố gắng ghi đè là ảo.

112
00:07:45,790 --> 00:07:53,680
‫Và về cơ bản, từ khóa ghi đè không hoàn toàn cần thiết, cũng như không đặt ảo lại một thứ gì

113
00:07:53,680 --> 00:07:56,200
‫đó ở cấp độ con của súng.

114
00:07:56,200 --> 00:07:59,350
‫Vì vậy, bạn không cần phải đặt ảo, nhưng nó không có hại để làm điều đó.

115
00:07:59,560 --> 00:08:06,550
‫Nhưng ghi đè đặc biệt hữu ích vì nó cho phép chúng tôi đảm bảo rằng chúng tôi đã đặt tên chính

116
00:08:06,550 --> 00:08:07,030
‫xác.

117
00:08:07,030 --> 00:08:10,690
‫Vì vậy, nếu tôi nhấn run, mọi thứ vẫn chạy như trước khi tôi có ghi đè.

118
00:08:10,690 --> 00:08:17,290
‫Nhưng giả sử tôi đã nhập nhầm tên của phương thức này nên tôi không thực hiện việc ghi đè.

119
00:08:17,290 --> 00:08:19,490
‫Và tôi đã gọi nó là không có bắn.

120
00:08:19,870 --> 00:08:22,750
‫Ví dụ, tôi đã sao chép tên sai.

121
00:08:22,750 --> 00:08:24,520
‫Tôi đã gõ nó vào thay vì sao chép nó.

122
00:08:24,520 --> 00:08:29,230
‫Nếu tôi nhấn run bây giờ, thì bạn thấy đấy, chúng tôi lại gặp phải lỗi tương tự vì chúng tôi đang cố gọi để bắn.

123
00:08:29,230 --> 00:08:32,350
‫Chúng tôi ghi đè nhầm nó không chính xác.

124
00:08:32,350 --> 00:08:33,820
‫Nó sẽ nổ, nổ.

125
00:08:33,910 --> 00:08:37,840
‫Vì vậy, cách tôi có thể tránh điều này là nói, Chà, tôi đang cố gắng ghi đè thứ gì đó.

126
00:08:37,840 --> 00:08:44,170
‫Vì vậy, tôi đã đặt từ khóa ghi đè của mình vào đây và nếu tôi cố gắng biên dịch nó ngay bây giờ, bạn có thể thấy rằng nó nói rằng

127
00:08:44,170 --> 00:08:50,260
‫game bắn súng được đánh dấu là ghi đè, nhưng không có phương pháp nào, không có phương pháp ảo nào để tôi ghi đè, trong trường hợp đó tôi có

128
00:08:50,260 --> 00:08:52,360
‫thể truy cập, Ồ đúng rồi, tôi đã gõ nhầm.

129
00:08:52,360 --> 00:08:57,340
‫Vì vậy, tôi sẽ tiếp tục và sửa mã của mình và chỉ cần quay lại để bắn.

130
00:08:57,340 --> 00:08:59,320
‫Và bây giờ nó hoạt động như tôi dự định.

131
00:08:59,320 --> 00:09:04,150
‫Vì vậy, nó chỉ là một chút an toàn bổ sung bằng cách ghi đè lên đó và ngay lập tức điều này.

132
00:09:04,240 --> 00:09:09,170
‫Nó cũng bảo vệ chúng ta khỏi trường hợp thứ mà chúng ta đang cố gắng ghi đè không phải là ảo.

133
00:09:09,190 --> 00:09:14,680
‫Nếu tôi cố gắng làm điều đó, bạn có thể thấy rằng nó nói rằng nó được đánh dấu là ghi

134
00:09:14,680 --> 00:09:19,410
‫đè, nhưng nó không ghi đè vì lớp cha đó không có chức năng ảo để chụp.

135
00:09:19,420 --> 00:09:25,570
‫Vì vậy, hy vọng điều này đã cung cấp cho bạn phần nào tổng quan về cách C ++ sử dụng và triển khai các hàm

136
00:09:25,570 --> 00:09:28,330
‫ảo và tại sao chúng ta phải nói rõ về chúng.

137
00:09:28,600 --> 00:09:32,890
‫Bây giờ chúng ta hãy nghĩ về một số trường hợp sử dụng khác cho các hàm ảo nói chung.

138
00:09:32,890 --> 00:09:34,750
‫Chúng tôi đã thấy một số từ động cơ.

139
00:09:34,750 --> 00:09:37,630
‫Bạn đã thấy ảo được sử dụng ở đâu trước đây?

140
00:09:38,450 --> 00:09:40,190
‫Bạn có thể tưởng tượng sử dụng nó ở đâu?

141
00:09:40,220 --> 00:09:45,110
‫Chúng tôi vừa xem một ví dụ về trường hợp sử dụng trong đó bạn có thể có một khẩu súng và các ghi đè khác nhau của khẩu

142
00:09:45,110 --> 00:09:46,880
‫súng đó thực hiện bắn theo những cách khác nhau.

143
00:09:47,300 --> 00:09:53,630
‫Làm thế nào khác bạn có thể tưởng tượng bằng cách sử dụng các hàm ảo ghi đè chức năng trong các lớp cha khi bạn nghĩ ra

144
00:09:53,630 --> 00:09:55,530
‫câu trả lời cho hai câu hỏi đó?

145
00:09:55,550 --> 00:10:01,290
‫Truy cập và theo liên kết đến các cuộc thảo luận trong bài giảng này và đăng câu trả lời của bạn ở đó.

146
00:10:01,310 --> 00:10:06,010
‫Các trường hợp sử dụng và những nơi bạn đã sử dụng chúng trước đây và xem những gì người khác đã nghĩ ra.

147
00:10:06,020 --> 00:10:11,250
‫Có thể điều đó sẽ giúp bạn củng cố sự hiểu biết của mình về các phương pháp ảo.

148
00:10:11,270 --> 00:10:12,280
‫Đó là nó cho bài giảng này.

149
00:10:12,290 --> 00:10:15,710
‫Hẹn gặp lại bạn trong phần tiếp theo, nơi chúng ta sẽ sử dụng các phương pháp ảo trong cơn tức giận.

