c++多态

多态是c++面向对象三大特性之一

多态分为静态多态和动态多态

  。静态多态:函数重载,运算符重载属于静态多态,服用函数名

  。动态多态:派生类和虚函数实现运行时多态

静态多态和动态多态区别

  。静态多态的函数地址早绑定,编译时确定函数地址

  。动态多态的函数地址玩绑定,运行阶段确定函数地址

  。虚函数再函数返回类型前叫virtual成为虚函数

      virtual void speek();{}

    动态多态满足条件

    1、有继承关系

    2、子类重写父类的虚函数,

          重写是指; 函数返回值类型相同 ,函数名函数形参列表相同。

      父类中的虚函数virtual关键字不能省略,子类中的可省略。

    动态多态的使用

      。父类的指针或引用,指向子类对象

            void dospeak(animal &animal)

 

 

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 class animal //动物类
 5 {
 6 public:
 7     virtual void speak()//前面加上virtual叫虚函数
 8     {
 9         cout << "动物在说话" << endl;
10     }
11 };
12 class cat :public animal//猫类
13 {
14 public:
15     void speak()//子类虚函数可以省略virtual 父类虚函数重写
16     {
17 
18         cout << "猫在说话" << endl;
19     }
20 
21 };
22 class dog : public animal
23 {
24 public:
25     void speak()//子类虚函数可以省略virtual 父类虚函数重写
26     {
27         cout << "狗在叫" << endl;
28     }
29 };
30 void dospeak(animal & animal)//多态调用父类指针或引用指向子类对象
31 {
32     animal.speak();
33     
34 }
35 void test()
36 {
37     cat cat;
38     dospeak(cat);//父类可以直接接收子类对象,不需要转换。
39     dog dog;
40     dospeak(dog);
41 }
42 int main()
43 {
44     test();
45     return 0;
46 }

 

父类指针或引用 指向子类对象时,发生多态  底层实现   

  vfptr----+     虚函数指针    animal        cat        dog

      |

      V

      vtable             anima::speak()    cat::speak()    dog::speak()

 

 

 

 纯虚函数语法

    virtual 返回值类型函数名(参数列表)=0;

 

当类中有了纯虚函数,这个类也叫抽象类

  抽象类特点:

    。无法实例化对象

    。子类必须重写抽象类的纯虚函数,否则属于抽象类

    

posted @ 2021-02-22 23:12  两天阿来  阅读(481)  评论(0)    收藏  举报