Commit 6e1fd09 1 parent 900b641 commit 6e1fd09 Copy full SHA for 6e1fd09
File tree 1 file changed +74
-3
lines changed
1 file changed +74
-3
lines changed Original file line number Diff line number Diff line change 2
2
3
3
[ TOC]
4
4
5
- ## 虚函数的缺点
5
+ 如果一个东西叫起来像一只鸭,走起路来像一只鸭,那么不妨认为他就是一只鸭。
6
6
7
- TODO
7
+ 我们有三种类型的狗:拉布拉多犬,藏獒,张心欣。
8
+
9
+ > {{ icon.fun }} 请勿侮辱拉布拉多和藏獒!
10
+
11
+ 他们有一个共同点,那就是它们都会狗叫(bark)以及自我介绍(intro)。
12
+
13
+ ``` cpp
14
+ struct Labrador {
15
+ void intro() {
16
+ puts("我能帮你捡回棍棍!");
17
+ }
18
+
19
+ void bark() {
20
+ puts("汪汪!");
21
+ }
22
+ };
23
+
24
+ struct Mastiff {
25
+ void intro() {
26
+ puts("我能保卫国王荣耀!");
27
+ }
28
+
29
+ void bark() {
30
+ puts("汪汪!");
31
+ }
32
+ };
33
+
34
+ struct Xinxin {
35
+ void intro() {
36
+ puts("我能祝您裁员滚滚!");
37
+ }
38
+
39
+ void bark() {
40
+ puts("从未贡献任何核心功能!");
41
+ }
42
+ };
43
+ ```
44
+
45
+ 现在,我们需要设计一个“饲养员”函数,他会让狗狗先自我介绍,然后叫两声。
46
+
47
+ 传统的基于重载的写法,需要连续写三个一模一样的函数体,非常麻烦,违反“避免重复”原则,不利于代码未来的维护。
48
+
49
+ ``` cpp
50
+ void feeder (Labrador dog) {
51
+ dog.intro();
52
+ dog.bark();
53
+ dog.bark();
54
+ }
55
+
56
+ void feeder(Mastiff dog) {
57
+ dog.intro();
58
+ dog.bark();
59
+ dog.bark();
60
+ }
61
+
62
+ void feeder(Xinxin dog) {
63
+ dog.intro();
64
+ dog.bark();
65
+ dog.bark();
66
+ }
67
+ ```
68
+
69
+ 方案1:模板函数
70
+
71
+ ```cpp
72
+ template <typename Dog>
73
+ void feeder(Dog dog) {
74
+ dog.intro();
75
+ dog.bark();
76
+ dog.bark();
77
+ }
78
+ ```
8
79
9
- ## 模板函数的缺点
80
+ 此处把 ` Dog ` 定义为模板函数
10
81
11
82
TODO
You can’t perform that action at this time.
0 commit comments