码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【C++】多态 ④ ( 多态实现原理 | C++ 联编概念 | 链接属性 | 内部链接 | 外部链接 | 联编与链接 | 静态联编 | 动态联编 | 联编 与 virtual 关键字 )


    文章目录

    • 一、C++ 联编概念
      • 1、联编引入
      • 2、链接属性 ( 内部链接 | 外部链接 )
      • 3、联编 ( C++ 语言 ) 与 链接 ( C 语言 )
      • 4、静态联编
      • 5、动态联编
    • 二、多态实现原理 - 联编 与 virtual 关键字





    一、C++ 联编概念




    1、联编引入


    " 联编 " Linkage 指的是 将 程序模块 和 代码 互相关联的过程 , 将不同源文件中的 同名函数 或 变量 进行链接 ;

    在 C++ 语言中 , 每个 函数 或 变量 都有一个 链接属性 , 该链接属性决定了该 函数 或 变量 是否可以在其他源文件中使用 ;


    联编 是通过 声明函数或变量 的 链接属性 进行控制 ;

    • 如果一个 函数或变量 具有外部链接属性 , 则可以在其他源文件中使用该函数或变量 ;
    • 如果一个 函数或变量 具有内部链接属性 , 则只能在其所在的源文件中使用该函数或变量。

    2、链接属性 ( 内部链接 | 外部链接 )


    C++ 中的 链接属性 有两种 : 内部链接 和 外部链接 ;

    • 内部链接 : 使用 static 关键字 声明 函数 或 变量 , 该 函数 或 变量 就具有了 内部链接 属性 ; 具有 内部链接 属性的函数或变量 只能在其所在的源文件中使用 , 不能在其他源文件中使用 ;
    • 外部链接 : 没有使用 static 关键字 声明 函数 或 变量 , 该 函数或变量 就具有了 外部链接 属性 ; 具有 外部链接 属性的函数或变量 可以在其他源文件中使用 , 使用前需要再这些源文件中声明 函数或 变量 ;

    3、联编 ( C++ 语言 ) 与 链接 ( C 语言 )


    C++中的 联编概念 与 C 语言中的 链接概念 :

    • 链接 : 在 C 语言中 , 链接 是指在 编译时将不同源文件中的函数和变量链接在一起的过程 , 具体指的是 将 二进制的 .o 机器码文件 , 与 .a 静态库 或 .so 动态库 , 拼装成可执行文件 ;
    • 联编 : 在 C++ 中 , 联编 是在编译时进行的 , 即使函数或变量的链接属性为外部链接 , 也需要在其他源文件中进行声明才能使用 ;

    C 语言编译过程 参考 【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 ) 博客 ;

    链接操作 是 将 二进制的 .o 机器码文件 , 与 .a 静态库 或 .so 动态库 , 拼装成可执行文件 ;

    在这里插入图片描述


    4、静态联编


    静态联编 是指在 编译时 确定的 变量 和 函数 的 链接关系 ,

    由 编译器 根据 函数和变量的声明 以及它们所在的 源文件 来确定它们之间的 链接关系 ;


    在 C++ 语言中 , 所有的 函数和变量 默认都具有 外部链接 属性 ,

    因此 , 只要在 不同的源文件 中 声明了相同的函数或变量名 , 就可以在 链接 时将它们 链接 在一起 ;


    5、动态联编


    " 动态联编 " 是指在 运行时 确定的 链接关系 , 它是由 程序 在 运行时 根据需要 动态地 加载和链接 不同的模块 ;

    C++ 语言中 没有 直接支持 动态联编 的特性 , 但可以使用 动态库 技术来实现动态链接 ;

    进行 动态链接 时 , 使用 外部链接 属性的 函数或变量名 来 链接 不同的模块 ;


    静态联编 和 动态联编 是两种不同的链接方式 , 其 链接时间 和 链接方式 都不同 ;

    • 静态联编 发生在 编译时 ;
    • 动态联编 发生在 运行时 ;




    二、多态实现原理 - 联编 与 virtual 关键字



    如果 函数前 不使用 virtual 关键字 修饰 , 就是 静态联编 ;

    也就是 该 不使用 virtual 关键字 修饰的 函数, 在 编译器 编译阶段 , 就已经确定了 , 如何执行该函数 , 之后就无法修改了 ;


    在 " 多态 " 中 , 如果 使用 virtual 关键字 修饰 函数 , 该函数就是 动态联编 ;

    在 编译时 , 不确定 执行 哪个函数 ,

    在 运行时 , 才确定 要执行 哪个 函数 ;

  • 相关阅读:
    项目十一文件的应用
    「Qt中文教程指南」如何创建基于Qt Widget的应用程序(一)
    [react] 什么是虚拟dom?虚拟dom比操作原生dom要快吗?虚拟dom是如何转变成真实dom并渲染到页面的?
    flink以增量+全量的方式更新广播状态
    2023年10月中国数据库排行榜:墨天轮榜单前五开新局,金仓、亚信热度攀升
    企业常用Linux三剑客awk及案例/awk底层剖析/淘宝网cdn缓存对象分级存储策略案例/磁盘知识/awk统计与计算-7055字
    使用 .NET Reactor 混淆C#程序后,调用ToJson()出现Newtonsoft.Json.JsonSerializationException
    Unity制作旋转光束
    算法金 | 统计学的回归和机器学习中的回归有什么差别?
    TS(五):装饰器
  • 原文地址:https://blog.csdn.net/han1202012/article/details/134094987
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号