C++类基础(十三)
类的继承
● 通过类的继承(派生)来引入“是一个”的关系( 17.2 — Basic inheritance in C++)

– 通常采用 public 继承( struct V.S. class )
– 注意:继承部分不是类的声明
– 使用基类的指针或引用可以指向派生类对象
struct Base
{};
struct Base2 : Base
{};struct Derive : Base2 //注意,不是声明,该语句等价于struct Derive : public Base,即struct缺省继承方式为public
//class Derive : Base2 //等价于class Derive : private Base,即class缺省继承方式为private
{};int main()
{Derive d;Base& ref = d; //OKBase* ptr = &d; //OK
}
– 静态类型 V.S. 动态类型
struct Base
{void funBase() {} //静态类型
};
struct Base2 : Base
{void funBase2() {} //静态类型
};
struct Derive : Base2
{void funDerive() {} //静态类型
};
struct Derive2 : Base2
{void funDerive2() {} //静态类型
};
int main()
{Derive d;Derive2 d2;Base& ref = d; //静态类型: 即编译期就能决定的类型且不能改变Base* ptr = &d; //动态类型ref.funBase(); //OK,静态类型没有改变ref.funDerive(); //静态类型不能发生改变,Error: No member named 'funDerive' in 'Base'ptr = &d2; //OK,动态类型可以在运行期发生改变return 0;
}
– protected 限定符:派生类可访问
struct Base
{
private:void funBase() {}
};
struct Derive : Base
{void funDerive(){funBase(); //Error: 'funBase' is a private member of 'Base'}
};
int main()
{Base b;b.funBase(); //Error: 'funBase' is a private member of 'Base'return 0;
}
struct Base
{void funBase() {}
};
struct Derive : Base
{void funDerive(){funBase(); //OK}
};
int main()
{Base b;b.funBase(); //OKDerive d;d.funBase(); //OKd.funDerive(); //OKreturn 0;
}
struct Base
{
protected:void funBase() {}
};
struct Derive : Base
{void funDerive(){funBase(); //OK}
};
int main()
{Base b;b.funBase(); //Error: 'funBase' is a protected member of 'Base'Derive d;d.funBase(); //Error: 'funBase' is a protected member of 'Base'd.funDerive(); //OKreturn 0;
}
● 类的派生会形成嵌套域
– 派生类所在域位于基类内部
– 派生类中的名称定义会覆盖基类
struct Base
{int val = 2;
};
struct Derive : Base
{void funDerive(){std::cout << val << std::endl;}int val = 3;
};
int main()
{Derive d;d.funDerive();return 0;
}

struct Base
{int val = 2;
};
struct Derive : Base
{void funDerive(){std::cout << val << std::endl;}//int val = 3;
};
int main()
{Derive d;d.funDerive();return 0;
}

– 使用域操作符显式访问基类成员
struct Base
{int val = 2;
};
struct Derive : Base
{void funDerive(){std::cout << val << std::endl;std::cout << Base::val << std::endl;}int val = 3;
};
int main()
{Derive d;d.funDerive();return 0;
}

– 在派生类中调用基类的构造函数
struct Base
{Base(){std::cout << "Base()\n";}
};
struct Derive : Base
{Derive(){std::cout << "Derive()\n";}
};
int main()
{Derive d;return 0;
}

struct Base
{Base(int){std::cout << "Base()\n";}
};
struct Derive : Base
{Derive(int a) //缺省构造函数调用基类的缺省构造函数,Error: Constructor for 'Derive' must explicitly initialize the base class 'Base' which does not have a default constructor{std::cout << "Derive()\n";}
};
int main()
{Derive d;return 0;
}
struct Base
{Base(int){std::cout << "Base()\n";}
};
struct Derive : Base
{Derive(int a) //缺省构造函数调用基类的缺省构造函数,Error: Constructor for 'Derive' must explicitly initialize the base class 'Base' which does not have a default constructor: Base(a) //显式调用基类的构造函数{//Base::Base(a); //Error: Qualified reference to 'Base' is a constructor name rather than a type in this contextstd::cout << "Derive()\n";}
};
int main()
{Derive d(2);return 0;
}

参考
深蓝学院: C++基础与深度解析
17.2 — Basic inheritance in C++
相关文章:
C++类基础(十三)
类的继承 ● 通过类的继承(派生)来引入“是一个”的关系( 17.2 — Basic inheritance in C) – 通常采用 public 继承( struct V.S. class ) – 注意:继承部分不是类的声明 – 使用基类的指针…...
03 OpenCV图像运算
文章目录1 普通加法1 加号相加2 add函数2 加权相加3 按位运算1 按位与运算2 按位或运算、非运算4 掩膜1 普通加法 1 加号相加 在 OpenCV 中,图像加法可以使用加号运算符()来实现。例如,如果要将两幅图像相加,可以使用…...
【C语言学习笔记】:动态库
一、动态库 通过之前静态库那篇文章的介绍。发现静态库更容易使用和理解,也达到了代码复用的目的,那为什么还需要动态库呢? 1、为什么还需要动态库? 为什么需要动态库,其实也是静态库的特点导致。 ▶ 空间浪费是静…...
Zookeeper
zookeeper是一个分布式协调服务。所谓分布式协调主要是来解决分布式系统中多个进程之间的同步限制,防止出现脏读,例如我们常说的分布式锁。 zookeeper中的数据是存储在内存当中的,因此它的效率十分高效。它内部的存储方式十分类似于文件存储…...
wav转mp3,wav转换成mp3教程
很多使用音频文件的小伙伴,总会接触到不同类型的音频格式,根据需求不同需要做相关的处理。比如有人接触到了wav格式的音频,这是windows系统研发的一种标准数字音频文件,是一种占用磁盘体积超级大的音频格式,通常用于录…...
springboot项目配置文件加密
1背景: springboot项目中要求不能采用明文密码,故采用配置文件加密. 目前采用有密码的有redis nacos rabbitmq mysql 这些配置文件 2技术 2.1 redis nacos rabbitmq 配置文件加密 采用加密方式是jasypt 加密 2.1.1 加密步骤 2.1.2 引入maven依赖 …...
公司招聘:33岁以上的和两年一跳的不要,开出工资我还以为看错了...
导读:对于公司来说,肯定是希望花最少的钱招到最优秀的员工,但事实上这个想法是不太现实的,虽然如今互联网不太好找工作,但要员工降薪去入职,相信还是有很大难度的,很多人宁可在家休息࿰…...
【置顶】:文章合集系列
【置顶】:文章合集系列 必看 文章中的所有内容仅供做个人学习使用,所有环境都在本地搭建并验证,任何人使用文中方法进行未经授权的渗透行为都与文章与我本人无关,请各位大佬不要进行未经授权的渗透行为…… 前言 之前更新过一段…...
Go的web开发Gin框架1(八)——Gin
一、重点内容: 知识要点有哪些? 1、了解Gin框架 2、导入使用Gin框架 3、尝试配合GORM开发 4、整合html,css,js 二、详细知识点介绍: 1、Gin框架介绍 Gin是一个golang的微框架,封装比较优雅&…...
吴思进——复杂美创始人首席执行官
杭州复杂美科技有限公司创始人兼CEO, 本科毕业于浙江大学机械专业,辅修过多门管理课程;1997年获经济学硕士学位,有关对冲基金的毕业论文被评为优秀;2008年创办杭州复杂美科技有限公司。 吴思进 中国电子学会区块链委员会专家&…...
apk简单介绍(组成以及打包安装流程)
apk简单介绍APK 的组成apk安装流程app的启动过程apk打包流程AIDLAIDL介绍为什么要设计这门语言它有哪些语法?默认支持的数据类型包括什么是apk打包流程了解打包流程能做什么操作APK 的组成 APK 其实是一个 zip 类型的压缩包,而一个典型的 APK 通常都会包…...
ffmpeg学习笔记之SDL视频播放器
看了雷神的 100行代码实现最简单的基于FFMPEGSDL的视频播放器(SDL1.x) 后手痒难耐,决定将里面的代码重新建一个 首先建立一个空项目,新建一个Mysimplest.cpp的文件。在里面写代码 #include <stdio.h>extern "C" …...
【Git】合并多条 commit 注释信息
文章目录1、查看 commit 记录2、合并 commit 注释1、查看 commit 记录 # 3 指的是查看最近 3 次的 commit 记录,如果要查看多次的可以修改数字 # -3 不加,则表示查看所有 commit 记录,一般还是用数字去指定 git log -32、合并 commit 注释 …...
【gcc/g++】程序的翻译(.c -->.exe)
环境:centos7.6,腾讯云服务器Linux文章都放在了专栏:【Linux】欢迎支持订阅🌹前言我们在写完代码运行时会发现生成了一个.exe的可执行程序,那么该程序是如何形成的呢?本次章节将在linux下用编译器gcc进行一…...
电话号码的字母组合-力扣17-java
一、题目描述给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例 1:输入:digits "23"输出…...
Archery-SQL审核查询平台
Archery-SQL审核查询平台 文章目录Archery-SQL审核查询平台一、功能列表介绍1.1、SQL审核MySQL实例非MySQL实例审核执行分离SQL工单自动审批、高危语句驳回快速上线其他实例定时执行1.2、SQL查询多类型数据库支持授权管理页面体验1.3、SQL优化慢日志管理SQL语句优化1.4、实例管…...
MySQL8.0安装教程
文章目录1.官网下载MySQL2.下载完记住解压的地址(一会用到)3.进入刚刚解压的文件夹下,创建data和my.ini在根目录下创建一个txt文件,名字叫my,文件后缀为ini,之后复制下面这个代码放在my.ini文件下ÿ…...
一文详解工业知识模型互联平台MoHub
1月8日,MWORKS 2023产品发布会落下帷幕。会上,同元软控隆重推出了云原生的工业知识模型互联平台MoHub,引起广泛关注。本文将从服务定位、架构方案、核心服务、持续运营等方面对MoHub平台进行全面介绍。1 MoHub平台的服务定位装备数字化的必要…...
MySQL入门篇-MySQL表连接小结
备注:测试数据库版本为MySQL 8.0 这个blog我们来聊聊常见的表连接的方法 测试数据: create table t1(id int); create table t2(id int);insert into t1 values(1); insert into t1 values(2);insert into t2 values(2); insert into t2 values(3); commit;内连接 --求交集 …...
使用纹理(Textures)
当物体表面并非是纯色的时候,比如带波点,斑纹或者表面有刮痕或被裂纹等,这些效果该如何实现呢? 这里我们需要提到一个概念是贴图(Maps)。Maps是覆盖在游戏物体上的2D图片,用来设置表面的颜色、s…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
