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个字节存储的是一个指针,叫 虚函数指针

 

  

 

(〃>_<;〃)(〃>_<;〃)(〃>_<;〃)

posted @ 2023-02-24 14:26  我会变强的  阅读(36)  评论(0编辑  收藏  举报