前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C++】多态 ④ ( 多态实现原理 | C++ 联编概念 | 链接属性 | 内部链接 | 外部链接 | 联编与链接 | 静态联编 | 动态联编 | 联编 与 virtual 关键字 )

【C++】多态 ④ ( 多态实现原理 | C++ 联编概念 | 链接属性 | 内部链接 | 外部链接 | 联编与链接 | 静态联编 | 动态联编 | 联编 与 virtual 关键字 )

作者头像
韩曙亮
发布2023-10-30 14:12:31
1180
发布2023-10-30 14:12:31
举报

一、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 关键字 修饰 函数 , 该函数就是 动态联编 ;

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、C++ 联编概念
    • 1、联编引入
      • 2、链接属性 ( 内部链接 | 外部链接 )
        • 3、联编 ( C++ 语言 ) 与 链接 ( C 语言 )
          • 4、静态联编
            • 5、动态联编
            • 二、多态实现原理 - 联编 与 virtual 关键字
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档