码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 49 - 多态的概念和意义


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

    文章目录

    • 1. 函数重写回顾
    • 2. 多态的概念和意义
      • 2.1 面向对象中的多态的概念
      • 2.2 C++ 语言直接支持多态的概念
        • 2.2.1 通过使用 virtual 关键字对多态进行支持
        • 2.2.2 编程实验:多态的初体验
      • 2.3 多态的意义
      • 2.4 理论中的概念
        • 2.4.1 静态联编和动态联编
        • 2.4.2 实例分析:静态联编和动态联编
    • 3. 小结

    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++ 中支持多态的唯一方式
    • 被重写的虚函数可表现为 多态 的特性
  • 相关阅读:
    我为什么错怪了goroutine
    【VUE】从源码角度说清楚MVVM!实现v-model!真的很简单!
    【华为上机真题 2022】字符串比较
    代码随想录训练营二刷第三十天 | 332.重新安排行程 51. N皇后 37. 解数独
    Stack Overflow 2022 开发者调查:行业走向何方?
    JSD-2204-JavaScript-Vue-Day05
    Java通用转换地图坐标系离线算法,天地图和超图WGS84坐标系、高德GCJ-02坐标系和百度BD-09坐标系三个坐标系互相转换
    openGauss学习笔记-241 openGauss性能调优-SQL调优-审视和修改表定义
    c++ 11 线程池---完全使用c++ 11新特性
    ArcGIS笔记11_提取栅格中的数据到点要素
  • 原文地址:https://blog.csdn.net/weixin_36098975/article/details/128037200
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号