当前位置: 首页 > news >正文

c++ | 动态编译|虚函数表|虚函数

c++ 的多态,是c++ 的一大核心特点,也是面向对象思想必须要实现的,不然面向对象也就是没啥光芒? 像 Go 也是有多态这个思想的


c++ 的多态主要有 静态编译多态和动态运行多态
静态编译多态,简单理解就是在编译的时候实现的 多态 。比如重载。注意:c 是没有重载这一说法的
什么是重载?
可以这么理解,重载 对函数、参数列表这种头部啊 入口啊 特别看重,而像出口啊就不态注意了。也好理解,因为编译的时候其实就是匹配,类型匹配啊,并不会去跑一遍,去看看返回什么值啊

这三个 test 函数都是重载,有人将重载是在 class 类中的,但是经过本人测试  在同一作用域 都是可以实现重载的void test(int a);void test(int a, char b);int test(int a);

再讲讲动态多态吧

讲到动态多态,首先就是要讲讲虚函数
虚函数,有纯虚函数,和普通虚函数,纯虚函数是在基类只写一个接口,并没有任何实现(可以理解为是一个空壳)

在派生类中对基类虚函数 重写 会把基类的虚函数 给隐藏 也叫覆盖
派生类通过继承的关系获取基类相应的权限的类成员。

这里再稍微展开讲讲,继承了哪些权限?
默认的类权限访问 是 privated ,继承默认也是 privated 注意 c struct 默认是 public 注意 c++ 的 struct 也可以实现重载、继承 ==> 多态。而c 的 struct 只能封装一些数据类型 ==> 自定义类型

公有继承 ==> 公有部分依然公有访问(注意:基类共有部分只能在派生类类内访问)。protect 保护范围 类内(派生类、基类)访问,什么叫类内访问?就是通过成员方法访问类的成员(这是为了体现封装性,注意啊 谨慎通过类对象对类成员访问,这样其实是破坏了封装性)。privated 私有范围,派生类无法访问,只允许基类类内访问。

protected ==> 公有部分 protected 访问(只能在派生类类内访问通过 protected 继承的public 部分)。protected 部分 protected 访问(只能在派生类类内访问通过 protected 继承的protected 部分)。privated 部分无法访问。

private ==> 公有部分 变成了 private、protected 部分变成了 private,剩下的全部都不可访问。

参考代码

public、protected、private都有哪些权限,各自又有哪些区别


再继续讲讲虚函数表
对了,在讲虚函数表之前,讲讲类的内存分配吧。
类成员会根据声明顺序一次分配内存,如果出现后面一个变量内存小于之前的已分配内存的整数倍,就会填充,如果后面的一个变量内存大雨前面已经分配的内存整数倍也会重新更新类内存分配的整数倍,否则就是按照之前的整数倍去分配。
这个规则和结构体分配内存是一样的。
注意:如果有虚函数,会额外添加一个虚函数表指针 8B

讲的太抽象了?举一个例子说说吧

class Base{
public:virtual void test(){};
private:int a; // 4B  [0-3]			当前内存分配的整数倍为 4fload b; //4B  [0-3] [4-7]  当前内存分配的整数倍 为 4double c; // 8;  [0-3][4-7] [8-11]  当前内存分配的整数倍 为 4char d; //1B			[0-3][4-7] [8-11][12-15 13、14、15 均被填充了] 当前内存分配的整数倍 为 4long long e; // 8B  [0-3][4-7] [8-11][12-15][16-23] 当前内存分配的整数倍 为 4
};
//注意了,最后还要再分配一个指针大小(指向虚函数表的指针)的内存空间
[0-3][4-7] [8-11][12-15][16-23] [14-31] 当前内存分配的整数倍 为 4

类对象通过虚函数表找到相应的虚函数
参考:虚函数表
参考:虚函数表02


简单自述了一下,cpp的水太深了

相关文章:

  • HTML和CSS基础(二)
  • 航空电子设备 MIL-STD-1553 收发器 HI-1573 / HI-1574
  • LinkedList与链表
  • Kubernetes面试整理-Kubernetes的主要组件有哪些?
  • SpringBoot三层架构
  • 高分论文密码---大尺度空间模拟预测与数字制图
  • 使用开源的zip.cpp和unzip.cpp实现压缩包的创建与解压(附源码)
  • 【机器学习】第2章 线性回归及最大熵模型
  • Android Room数据库使用介绍
  • SpringBoot3 整合 Mybatis 完整版
  • 【MySQL】分库分表
  • USB - 常用开发工具
  • C++ -- 红黑树的基本操作
  • 从零开始精通Onvif之图片抓拍
  • Mybatis --- 动态SQL 和数据库连接池
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 0基础学习移动端适配
  • Angular 响应式表单 基础例子
  • Debian下无root权限使用Python访问Oracle
  • Git 使用集
  • If…else
  • Javascript Math对象和Date对象常用方法详解
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • Laravel核心解读--Facades
  • python大佬养成计划----difflib模块
  • Python学习笔记 字符串拼接
  • yii2中session跨域名的问题
  • 编写符合Python风格的对象
  • 关于List、List?、ListObject的区别
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前端技术周刊 2019-01-14:客户端存储
  • 区块链共识机制优缺点对比都是什么
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 用 Swift 编写面向协议的视图
  • 用element的upload组件实现多图片上传和压缩
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • python最赚钱的4个方向,你最心动的是哪个?
  • # 飞书APP集成平台-数字化落地
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (C语言)fread与fwrite详解
  • (笔试题)分解质因式
  • (二)fiber的基本认识
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (九)信息融合方式简介
  • (六)Flink 窗口计算
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (数据结构)顺序表的定义