• 49 - 多态的概念和意义


    ---- 整理自狄泰软件唐佐林老师课程

    1. 函数重写回顾

    • 父类中被重写的函数依然会继承给子类
    • 子类中重写的函数将覆盖父类中的函数
    • 通过作用域分辨符(::)可以访问父类中的函数

    在这里插入图片描述
    p->print() 不符合预期,期望调用子类中的 print,实际调用父类中的 print

    2. 多态的概念和意义

    • 面向对象中 期望的行为
      • 根据 实际的对象类型 判断如何调用重写函数
      • 父类指针 / 引用指向父类对象则调用父类对象中定义的函数
      • 父类指针 / 引用指向子类对象则调用子类中定义的重写函数

    在这里插入图片描述

    2.1 面向对象中的多态的概念

    • 根据 实际的对象类型 决定函数调用的具体目标
    • 同样的调用语句在实际运行时有多种不同的表现形式

    在这里插入图片描述

    2.2 C++ 语言直接支持多态的概念

    2.2.1 通过使用 virtual 关键字对多态进行支持

    • 被 virtual 声明的函数 被重写后 具有 多态 特性
    • 被 virtual 声明的函数叫做 虚函数

    2.2.2 编程实验:多态的初体验

    #include 
    #include 
    
    using namespace std;
    
    class Parent
    {
    public:
        int mi;
        virtual void print() { // virtual 虚函数
            cout << "I'm Parent." << endl;
        }
    };
    
    class Child : public Parent
    {
    public:
        int mv;
        void print() {
            cout << "I'm Child." << endl;
        }
    };
    
    void how_to_print(Parent* p)
    {
    	p->print(); // 展现多态的行为
    }
    
    int main()
    {
        Parent p;
    	Child c;
        
    	how_to_print(&p);
    	how_to_print(&c);
    	
        return 0;
    }
    
    • 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

    在这里插入图片描述

    2.3 多态的意义

    • 在程序运行过程中展现出多态的特性
    • 函数重写 必须 多态实现,否则没有意义
    • 多态是面向对象组件化程序设计的基础特性

    2.4 理论中的概念

    2.4.1 静态联编和动态联编

    • 静态联编
      • 在程序的 编译期间 就能确定 具体的函数调用
        如:函数重载
    • 动态联编
      • 在程序 实际运行后 才能确定 具体的函数调用
        如:函数重写

    2.4.2 实例分析:静态联编和动态联编

    #include 
    #include 
    
    using namespace std;
    
    class Parent
    {
    public:
        virtual void func() {
            cout << "Parent void func()" << endl;
        }
        virtual void func(int i) {
            cout << "Parent void func(int i): " << i << endl;
        }
        virtual void func(int i, int j) {
            cout << "Parent void func(int i, int j) : " << "(" << i << ", " << j << ")" << endl;
    	}
    };
    
    class Child : public Parent
    {
    public:
        void func(int i, int j) {
            cout << "Child void func(int i, int j) : " << i + j << endl;
        }
        void func(int i, int j, int k) {
            cout << "Child void func(int i, int j, int k) : " << i + j + k << endl;
        }
    };
    
    void run(Parent* p)
    {
    	p->func(1, 2); // 展现多态的特性
    				   // 动态联编
    }
    
    int main()
    {
        Parent p;
    	
    	p.func(); // 函数重载,静态联编
    	p.func(1); // 函数重载,静态联编
    	p.func(1, 2); // 函数重载,静态联编
    	cout << endl;
    	
    	Child c;
    	c.func(10, 20);  // 同名覆盖,静态联编
    	cout << endl;
    	
    	run(&p);
    	run(&c);
    	
        return 0;
    }
    
    • 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

    在这里插入图片描述

    3. 小结

    • 函数重写只可能发生在 父类和子类之间
    • 根据 实际对象的类型 确定调用的具体函数
    • virtual 关键字是 C++ 中支持多态的唯一方式
    • 被重写的虚函数可表现为 多态 的特性
  • 相关阅读:
    Python AI 绘画
    IDM下载器使用教程
    9.7-一定要开始学了
    map 和 set 的一起使用
    Elastic Stack从入门到实践(一)--Elastic Stack入门(3)--Logstash入门与Elastic Stack实战
    精品基于NET实现的课堂学分管理系统
    基于gewe制作第一个微信聊天机器人
    计算机网络基本知识(八):域名、IP地址简介及分类
    qt day2
    LT6211UX是用于VR和Display应用的HDMI2.0到LVDS转换器
  • 原文地址:https://blog.csdn.net/weixin_36098975/article/details/128037200