-
Notifications
You must be signed in to change notification settings - Fork 273
/
Copy path静态绑定和动态绑定
56 lines (48 loc) · 1.47 KB
/
静态绑定和动态绑定
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
using namespace std;
class B {
public:
void mf() { cout << "mfB" << endl; }
virtual void name(int i)
{
cout << "nameB" << " " << i << endl;
}
virtual void sex()
{
cout << "sexB" << endl;
}
};
class D : public B
{
public:
void mf(int i) { cout << "mfD" << endl; }
virtual void name(double i)
{
cout << "nameD" << " " << i << endl;
}
virtual void sex()
{
cout << "sexD" << endl;
}
};
int main()
{
// 只有虚函数的重写(也就是多态)才是动态绑定,其行为取决于动态类型
// 其他诸如重写的虚函数的默认参数、虚函数的覆盖、非虚函数的重写和覆盖都是静态绑定,只会调用静态类型的行为
//pb1的静态类型是B*,动态类型是B*
//pb2的静态类型是B*,动态类型是D*
D d;
B b;
B *pb1 = &b;
B *pb2 = &d; //pb2的动态类型是D*,静态类型是B*,所以静态绑定的行为取决于静态类型
// 很显然,pb1,pb2的静态类型是B*,而mf是非虚函数的覆盖(重写也一样),所以是静态绑定,只会调用B*的方法,而不管动态类型是什么
pb1->mf();
pb2->mf();
// pb1,pb2的静态类型是B*,而name是虚函数的覆盖,所以是静态绑定,只会调用B*的方法,而不管动态类型是什么
pb1->name(2);
pb2->name(3);
// pb1,pb2的静态类型是B*,而sex是虚函数的重写,所以是动态绑定,pb1调用动态类型B*的方法,pb2调用动态类型D*的方法
pb1->sex();
pb2->sex();
return 0;
}