• 【C++】多态 ④ ( 多态实现原理 | C++ 联编概念 | 链接属性 | 内部链接 | 外部链接 | 联编与链接 | 静态联编 | 动态联编 | 联编 与 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 关键字 修饰 函数 , 该函数就是 动态联编 ;

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

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

  • 相关阅读:
    setup里面 计算属性与监视
    健康管理信息系统
    如何在vue3+vite搭建的项目里面使用new GLTFLoader()加载gltf文件报错出现Uncaught SyntaxError: Unexpected token ':'错误?
    工作应当有挑战
    WPF之Button组件
    动态规划:两个数组的dp问题(C++)
    基于STM32+华为云IOT设计的智能门禁系统
    【论文导读】- FederatedScope-GNN(FederatedScope-GNN:迈向统一、全面、高效的联邦图学习包)
    国密证书(gmssl)在Kylin Server V10下安装
    Do you know about Statistics?
  • 原文地址:https://blog.csdn.net/han1202012/article/details/134094987