C++黑马程序员——P135-136. 多态 基本语法,原理剖析
- P135. 类和对象——多态——多态的基本语法
- P136. 类和对象——多态——多态的原理剖析
- P135. 多态的基本语法
多态是C++面向对象三大特性之一(封装,继承,多态)
地址早绑定:
1 //动物类
2 class Animal
3 {
4 public:
5 void speak()
6 {
7 cout << "Animal speak" << endl;
8 }
9 };
10
11 //猫类
12 class Cat :public Animal
13 {
14 public:
15 void speak()
16 {
17 cout << "Cat speak" << endl;
18 }
19 };
20
21 //执行说话的函数
22 //地址早绑定 在编译阶段就确定了函数的地址
23 void DoSpeak(Animal& animal)
24 {
25 animal.speak();
26 }
27
28 void test01()
29 {
30 Cat cat;
31 DoSpeak(cat);
32 }
33
34 int main()
35 {
36 test01();
37 return 0;
38 }
运行结果:
多态的使用:
1 //动物类
2 class Animal
3 {
4 public:
5 //虚函数
6 virtual void speak()
7 {
8 cout << "Animal speak" << endl;
9 }
10 };
11
12 //猫类
13 class Cat :public Animal
14 {
15 public:
16 void speak()
17 {
18 cout << "Cat speak" << endl;
19 }
20 };
21
22 //狗类
23 class Dog :public Animal
24 {
25 public:
26 //子类重写函数的 virtual 可写可不写
27 virtual void speak()
28 {
29 cout << "Dog speak" << endl;
30 }
31 };
32
33
34 //执行说话的函数
35 //地址早绑定 在编译阶段就确定了函数的地址
36 //如果想执行让猫说话,那么这个函数地址就不能提前绑定,需要在运行阶段进行绑定:地址晚绑定
37
38 //动态多态满足条件:
39 //1. 有继承关系
40 //2. 子类重写父类的虚函数
41 //重写:函数返回值类型、函数名、参数列表 都相同
42 //子类重写的函数,关键字 virtual 可加可不加
43
44 //动态多态使用
45 //父类的 指针或引用 指向子类对象
46 void DoSpeak(Animal& animal)
47 {
48 animal.speak();
49 }
50
51 void test01()
52 {
53 Cat cat;
54 DoSpeak(cat);
55 Dog dog;
56 DoSpeak(dog);
57 }
58
59 int main()
60 {
61 test01();
62 return 0;
63 }
- P136. 多态的原理剖析
1 class C1
2 {
3 public:
4 void func() {};
5 };
6
7 class C2
8 {
9 public:
10 virtual void func() {};
11 };
12
13 int main()
14 {
15 cout << "sizeof(C1) = " << sizeof(C1) << endl;
16 cout << "sizeof(C2) = " << sizeof(C2) << endl;
17 return 0;
18 }
运行结果:
sizeof(C2) = 4,这4个字节存储的是一个指针,叫 虚函数指针
(〃>_<;〃)(〃>_<;〃)(〃>_<;〃)