C++ 快速回顾(四)

C++ 快速回顾(四)

  • 前言
  • 一、纯虚函数
  • 二、final关键字
    • 1.作用到函数
    • 2.作用到类
  • 三、虚函数原理
  • 四、Lambda一些知识补充


前言

用于快速回顾之前遗漏或者补充C++知识


一、纯虚函数

纯虚函数主要是当接口,没有具体的实现要到派生类去实现。

  • 纯虚函数不能直接实例化,类似c#中的抽象函数
class MyClassBase
{
public:virtual void Init() = 0;virtual void Destroy() = 0;
};int main()
{//MyClassBase Base; 不能实例化system("pause");return 0;
}
  • 纯虚函数的派生类,必须实现了纯虚函数才能实例化
class MyClassBase
{
public:virtual void Init() = 0;virtual void Destroy() = 0;
};class MyClass : public MyClassBase
{};int main()
{//MyClass Class; 不能实例化system("pause");return 0;
}
  • 正确的使用方式
class MyClassBase
{
public:virtual void Init() = 0;virtual void Destroy() = 0;
};class MyClass : public MyClassBase
{
public:virtual void Init() override{}virtual void Destroy() override{}
};int main()
{MyClass Class; // 可以实例化system("pause");return 0;
}

二、final关键字

final 主要是处理不想继续往下派生,禁止往下派生的情况
很像C#中的密封

1.作用到函数

class MyClassBase
{
public:virtual void Init() = 0;virtual void Destroy() = 0;
};class MyClass : public MyClassBase
{
public:virtual void Init() override{}virtual void Destroy() override final{}
};class ChildClass : public MyClass
{
public:virtual void Init() override{}// 无法重写//virtual void Destroy() override//{////}
};

2.作用到类

无法继续派生,不能用final类作为基类

class MyClassBase
{
public:virtual void Init() = 0;virtual void Destroy() = 0;
};class MyClass final : public MyClassBase
{
public:virtual void Init() override{}virtual void Destroy() override{}
};// 无法继续派生,不能用final类作为基类
class ChildClass : public MyClass
{};

三、虚函数原理

要弄懂这个问题,我们要从最基本的类的内存大小来看
下面的这个空类,所占的大小是1字节,可以说这一字节是用来占位的

class MyClass
{};int main()
{int size = sizeof(MyClass);std::cout << size << std::endl;system("pause");return 0;
}

可以看到当有个int类型的变量后大小变为了4

class MyClass
{int Value = 0;
};int main()
{int size = sizeof(MyClass);std::cout << size << std::endl;system("pause");return 0;
}

那如果加个函数大小会有什么变化?答案是仍然为4

class MyClass
{int Value = 0;void Init() {}
};int main()
{int size = sizeof(MyClass);std::cout << size << std::endl;system("pause");return 0;
}

如果我们写个虚函数可以发现大小变成了16

class MyClass
{virtual void Init(){}
};class MyClass1 : public MyClass
{int a = 0;
};int main()
{int size = sizeof(MyClass1);std::cout << size << std::endl;system("pause");return 0;
}

那这时候我们写多个虚函数呢?答案也是16,可以看到只要有一个虚函数之后再有多少个虚函数大小都是16了。
当我们有虚函数时编辑器会为其生成虚函数表指针(vptr) 这个虚函数表指针会指向一个虚函数表,里面存储着虚函数,当我们复写时会覆盖表中的函数导致重写后调用了新的函数。
但是为什么大小是16呢?因为在64位操作系统中虚函数表指针(vptr) 占8个字节,4+8 = 12 也不是16 ? 这是因为内存对齐的缘故通常8字节对齐。所以就是16字节了。

class MyClass
{virtual void Init(){}virtual void Init1(){}virtual void Init2(){}virtual void Init3(){}
};class MyClass1 : public MyClass
{int a = 0;
};int main()
{int size = sizeof(MyClass1);std::cout << size << std::endl;system("pause");return 0;
}

四、Lambda一些知识补充

一般的Lambda就不细讲了,只补充不知道的知识
注意这里不能直接传入,是因为Lambda传入的buffer 是加个Const的

int main()
{char buffer[1024] = "Hello World !!!";auto Test = [buffer](char* Value1){auto Test1 = [](char* Value2){printf(Value2);};Test1(buffer); // 注意这里不能直接传入,是因为Lambda传入的buffer 是加个Const的};system("pause");return 0;
}

加个const 即可

int main()
{char buffer[1024] = "Hello World !!!";auto Test = [buffer](char* Value1){auto Test1 = [](const char* Value2){printf(Value2);};Test1(buffer);};system("pause");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/87003.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/87003.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue入门学习时,按照官方的教程生成的vue3项目后,命令行运行npm install出现一堆warn,然后运行npm run dev报错,项目启动失败

日期&#xff1a;2025年6月27日 星期五农历六月初三 VUE版本&#xff1a;vue3 IDE&#xff1a;vs code vue入门学习时&#xff0c;按照官方的教程生成的vue3项目后&#xff0c;命令行运行npm install出现一堆warn&#xff0c;然后运行npm run dev报错&#xff0c;项目启动失败…

jQuery EasyUI 安装使用教程

一、jQuery EasyUI 简介 jQuery EasyUI 是一套基于 jQuery 的用户界面框架&#xff0c;提供了丰富的 UI 组件&#xff0c;如数据表格、树形结构、窗体、对话框等&#xff0c;适用于快速开发后台管理系统和 Web 应用界面。它封装了大量常用功能&#xff0c;使用简单&#xff0c…

python下划线开头函数总结

在Python中&#xff0c;以双下划线 __ 开头的函数&#xff08;或变量&#xff09;具有特殊的命名含义&#xff0c;主要用于实现类的私有成员、魔法方法&#xff08;特殊方法&#xff09;和名称修饰&#xff08;Name Mangling&#xff09;机制。下面详细解释这三种情况&#xff…

代理模式 - Flutter中的智能替身,掌控对象访问的每一道关卡!

痛点场景&#xff1a;直接加载高清大图 假设你的应用需要显示用户相册&#xff1a; NetworkImage(https://example.com/high-res-photo.jpg)面临的问题&#xff1a; &#x1f4f6; 网络差时长时间白屏&#x1f4be; 重复下载相同图片浪费流量&#x1f512; 敏感图片无权限验…

Python集合的创建

一、前言 在 Python 编程中&#xff0c;集合&#xff08;set&#xff09;是一种非常实用的数据结构&#xff0c;它能够存储一组无序且不重复的元素。集合广泛应用于数据去重、交并差运算等场景。 本文将重点讲解 Python 中集合的创建方式&#xff0c;包括使用大括号 {}、set(…

作物生长模型Oryza V3实战15:AutoCalibration程序详解

ORYZA 模型中的 AutoCalibration (v2.1).exe 是用于 ORYZA 模型参数自动校准的可执行程序,在优化 ORYZA 模型参数、提高模型模拟准确性方面具有重要作用。程序能够通过特定算法,在给定的参数取值范围内,自动搜索出一组最优的参数组合,使得模型模拟结果与实际观测数据(如作…

算法-每日一题(DAY12)最长和谐子序列

1.题目链接&#xff1a; 594. 最长和谐子序列 - 力扣&#xff08;LeetCode&#xff09; 2.题目描述&#xff1a; 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。 给你一个整数数组 nums &#xff0c;请你在所有可能的 子序列 中找到最长的和谐子序列的…

阿里云-云效自动部署spring boot项目

1.使用云效通过docker自动部署spring boot项目 1.1 spring boot项目配置 # 阿里云的jdk17镜像 FROM registry.cn-zhangjiakou.aliyuncs.com/publicci/openjdk:17-jdk-alpineENV APP_HOME /home/admin/app/# 将target/arms-application.jar 复制到容器中 /home/admin/app/app.…

SQL篇 添加约束、删除约束

SQL篇 添加约束、删除约束 1、相关链接2、约束的增删找查2.1 查看约束&#xff08;主键、外键、唯一性、检查约束&#xff09;2.2 查看默认约束2.3 修改约束&#xff08;添加/编辑/修改&#xff09;2.3.1 添加主键约束2.3.2 添加外键约束2.3.3 添加唯一性约束2.3.4 添加检查约束…

Python PyTorch 深度学习库 包 timm

文章目录 &#x1f4e6; 主要特点&#x1f680; 安装方式&#x1f9ea; 使用示例示例1&#xff1a;加载一个预训练模型进行图像分类示例2&#xff1a;获取模型结构信息 &#x1f310; 官方资源&#x1f50d; 常见用途✅ 优势总结 Timm 是一个非常流行且功能强大的 Python 深度学…

tree 命令集成到 Git Bash:可视化目录结构的指南

目录 1. 下载与准备 tree 工具   2. 集成 tree 到 Git Bash 环境   3. tree 命令基础用法详解   4. 使用示例 在软件开发和文件管理中&#xff0c;清晰的目录结构可视化是提高效率的重要手段。tree命令作为 UNIX/Linux 系统的标准工具&#xff0c;能以树形结构递归展…

如何搭建基于RK3588的边缘服务器集群?支持12个RK3588云手机

以下是基于RK3588搭建边缘服务器集群的完整实施方案&#xff0c;涵盖硬件选型、集群架构、软件部署及优化要点&#xff1a; &#x1f5a5;️ ‌一、硬件集群架构设计‌ ‌节点基础配置‌ ‌核心单元‌&#xff1a;单节点采用RK3588核心板&#xff08;4A762.4GHz 4A551.8GHz&am…

飞算 JavaAI:我的编程强力助推引擎

文章目录 引言&#xff1a;当Java开发遇上AI助手初识飞算JavaAI&#xff1a;专为Java而生的智能伴侣安装与配置&#xff1a;轻松上手的开始核心功能体验&#xff1a;从需求到代码的全流程革命1. 智能需求分析与拆解2. 智能接口设计3. 表结构智能生成4. 处理逻辑自动梳理5. 高质…

飞算JavaAI—AI编程助手 | 编程领域的‘高科技指南针’,精准导航开发!

目录 一、引言 1.1 什么是飞算JavaAI&#xff1f; 1.2 告别"996的孤独感"&#xff1a;AI成为你的编码搭子 1.3 成就感加速器&#xff1a;从"能运行"到"优雅实现" 1.4 极简下载体验&#xff1a;3步开启"开挂"模式 二、深入体验飞…

NPM组件 betsson 等窃取主机敏感信息

【高危】NPM组件 betsson 等窃取主机敏感信息 漏洞描述 当用户安装受影响版本的 betsson 组件包时会窃取用户的主机名、用户名、工作目录、IP地址等信息并发送到攻击者可控的服务器地址。 MPS编号MPS-2nrw-lifd处置建议强烈建议修复发现时间2025-06-30投毒仓库npm投毒类型主…

Apipost 与 Apifox:API 开发管理中的 AI 能力对比

在当今竞争激烈的 API 开发与测试领域&#xff0c;效率与质量是衡量工具优劣的关键指标。Apipost 凭借其强大的 AI 功能&#xff0c;为开发者和测试人员带来了前所未有的便利&#xff0c;而 Apifox 作为该领域的重要参与者&#xff0c;二者在实际应用中究竟有何差异&#xff1f…

Electron 菜单栏深度定制指南:从基础到高级实践

在现代桌面应用开发中&#xff0c;菜单栏作为用户界面的重要组成部分&#xff0c;不仅提供了应用功能的快速访问途径&#xff0c;还直接影响着用户的操作体验。Electron 作为跨平台桌面应用开发框架&#xff0c;为开发者提供了强大而灵活的菜单系统定制能力。本文将全面介绍 El…

QML通过XMLHttpRequest实现HTTP通信

转自个人博客 由于 QML 的 JavaScript 兼容性&#xff0c;我们可以直接使用 JavaScript 的 XMLHttpRequest 对象进行 HTTP 请求。QML 的 XMLHttpRequest 实现与标准浏览器的实现非常相似&#xff0c;但有一些限制和特殊行为需要注意。 而QML实现TCP等其他通信一般就需要借助Qt与…

Spring Boot 内置反向代理(Undertow Proxy)高可用配置

引言 在微服务架构中&#xff0c;反向代理是一个不可或缺的组件&#xff0c;它负责请求转发、负载均衡、安全过滤等关键功能。 通常我们会选择 Nginx、HAProxy 等专业反向代理组件&#xff0c;但在某些场景下&#xff0c;使用 Spring Boot 内置的反向代理功能可以简化架构&am…

ClickHouse 部署

Docker 部署 1、拉取镜像 docker pull clickhouse/clickhouse-server:latest单机版本部署 编写docker-compose.yml version: 3services:clickhouse-server:image: clickhouse/clickhouse-server:22.12container_name: clickhouse-serverports:- "8123:8123"ulimit…