C++ 多态实现原理

简介: C++ 多态实现原理

一、静态多态

函数重载,编译器确定

1.函数重载

  • 允许在同一作用域中声明多个功能类似的同名函数
  • 这些函数的参数列表,参数个数或者参数类型或者参数顺序不一样

注意: 不能通过返回值类型来区别重载

2.原理

  • 函数名修饰
  • 编程过程
    预编译:把头文件当中的函数声明拷贝到源文件,避免编译过程中的语法分析找不到函数定义
    编译:语法分析,同时进行符
    链接号汇总 (函数名)
    汇编:生成函数名到函数地址的映射,方便之后通过函数名找到函数定义位置,从而执行函数
    链接:将多个文件中的符号表汇总合并
  • objdump -t *o
    _ZN+类长度+类名+函数名长度+函数名+E +类型首字母

二、动态多态

虚函数重写,运行时确定

1. 虚函数重写

  • 在基类的函数前加上 virtual 关键字,在派生类重写该函数
  • 运行时将会根据对象的类型来调用相应的函数
  • 如果对象的类型是基类,则调用基类的函数
  • 如果对象的类型是派生类,则调用派生类的函数

2. 原理

  • 早绑定
    编译器编译时已经确定对象调用的函数的地址
  • 晚绑定
    若类使用 virtual 函数,则会为类生成虚函数表(一维数组,存放了虚函数地址),类对象构造时会初始化该虚函数表指针
    虚函数表指针在构造函数中初始化

推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家:

零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核)

https://xxetb.xet.tech/s/VsFMs


相关文章
|
1月前
|
C++
C++多态实现计算器
C++多态实现计算器
|
18天前
|
编译器 C++
c++的学习之路:22、多态(1)
c++的学习之路:22、多态(1)
21 0
c++的学习之路:22、多态(1)
|
1天前
|
C++
【C++】从零开始认识多态(二)
面向对象技术(oop)的核心思想就是封装,继承和多态。通过之前的学习,我们了解了什么是封装,什么是继承。 封装就是对将一些属性装载到一个类对象中,不受外界的影响,比如:洗衣机就是对洗衣服功能,甩干功能,漂洗功能等的封装,其功能不会受到外界的微波炉影响。 继承就是可以将类对象进行继承,派生类会继承基类的功能与属性,类似父与子的关系。比如水果和苹果,苹果就有水果的特性。
16 1
|
1天前
|
C++
【C++】从零开始认识多态(一)
面向对象技术(oop)的核心思想就是封装,继承和多态。通过之前的学习,我们了解了什么是封装,什么是继承。 封装就是对将一些属性装载到一个类对象中,不受外界的影响,比如:洗衣机就是对洗衣服功能,甩干功能,漂洗功能等的封装,其功能不会受到外界的微波炉影响。 继承就是可以将类对象进行继承,派生类会继承基类的功能与属性,类似父与子的关系。比如水果和苹果,苹果就有水果的特性。
14 4
存储 编译器 C++
10 2
|
9天前
|
C++
【C++】一文深入浅出带你参透库中的几种 [ 智能指针 ]及其背后实现原理(代码&图示)
【C++】一文深入浅出带你参透库中的几种 [ 智能指针 ]及其背后实现原理(代码&图示)
|
11天前
|
C++
深入理解 C++ 中的多态与文件操作
C++中的多态是OOP核心概念,通过继承和虚函数实现。虚函数允许对象在相同操作下表现不同行为,提高代码可重用性、灵活性和可维护性。例如,基类`Animal`声明`makeSound()`虚函数,派生类如`Cat`、`Dog`和`Bird`可重写该函数实现各自叫声。C++也提供多种文件操作,如`fstream`库的`ofstream`、`ifstream`用于读写文件,C++17引入的`<filesystem>`库提供更现代的文件操作接口。
19 0
|
11天前
|
监控 API 数据安全/隐私保护
屏幕监控软件开发指南:C++实现原理解析
在当今数字化时代,屏幕监控软件成为了企业管理和个人隐私保护的重要工具。本文将深入探讨如何使用C++语言实现屏幕监控软件,并解析其实现原理。我们将通过多个代码示例来说明其工作方式,最后将介绍如何将监控到的数据自动提交到网站。
50 3
|
17天前
|
存储 C++
【C++进阶(九)】C++多态深度剖析
【C++进阶(九)】C++多态深度剖析
|
18天前
|
编译器 C++
c++的学习之路:23、多态(2)
c++的学习之路:23、多态(2)
21 0