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

【C++】8___继承

目录

 一、基本语法

 二、继承方式

三、对象模型

四、继承中的构造与析构的顺序

五、继承中同名成员处理

 六、多继承语法

 七、菱形继承


 一、基本语法

好处:减少重复的代码

语法: class   子类  :  继承方式   父类

子类  也称为  派生类

父类  也称为  基类

派生类中的成员,包含两大部分:

一类是从基类继承过来的,一类是自己增加的成员

从基类继承过来的表现其共性,而新增的成员体现了其个性

 二、继承方式

  • class 子类 :public 父类

        父类中的public、protected继承在子类中依然不变,私有权限无法继承。

  • class 子类 :protected 父类

         父类中的public、protected继承在子类时变为protected,私有权限无法继承。

  • class 子类 :private 父类

        父类中的public、protected继承在子类时变为private,私有权限无法继承。

 代码示例

#include<iostream>
using namespace std;class base1{public:int m_A;
protected:int m_B;
private:int m_C;
};// public 继承
class Son1 : public base1{  void fun(){m_A = 10;m_B = 10;
//		m_C = 10; //私有权限无法继承}
};
void test1(){Son1 son1;son1.m_A = 2;
//	son1.m_B = 3;
//	son1.m_C = 4;
}// protected 继承
class Son2 : protected base1{void fun(){m_A = 10; //变为protectedm_B = 10;//变为protected//m_C = 10; //私有权限无法继承}
};
void test2(){Son2 son2;//	son2.m_A = 2; //变为protected,类外无法访问//	son2.m_B = 3; //变为protected,类外无法访问//	son2.m_C = 4;
}// private 继承
class Son3 : private base1{void fun(){m_A = 10; //变为privatem_B = 10; //变为private//m_C = 10; //私有权限无法继承}
};
void test3(){Son3 son3;
//		son3.m_A = 2; //变为private,类外无法访问//	son2.m_B = 3; //变为private,类外无法访问//	son2.m_C = 4;
}
int main(){test1();test2();test3();return 0;
}

三、对象模型

父类当中的非静态成员变量都会继承下去,私有成员也会继承,只是不能访问

代码示例

#include<iostream>
using namespace std;class per{
public:int m_A;
protected:int m_B;
private:int m_C;
};class son : public per{
public:int m_D;
};void test(){cout<<"sizeof(son)="<<sizeof(son)<<endl;
}int main(){test();
}

四、继承中的构造与析构的顺序

先构造父类,再构造子类。析构顺序与构造顺序相反

代码示例

#include<iostream>
using namespace std;class Base{
public:Base(){cout<<"父类中的构造"<<endl;}~Base(){cout<<"父类中的析构"<<endl;}
};class Son : public Base{
public:Son(){cout<<"子类中的构造"<<endl;}~Son(){cout<<"子类中的析构"<<endl;}
};void test(){
//	Base b;Son s;
}
int main(){test();return 0;
}

五、继承中同名成员处理

  •  子类对象可以直接访问到子类中的同名函数
  • 子类对象加作用域可以访问到父类中的成员函数
  • 当子类与父类拥有同名的成员函数时,子类会隐藏父类中同名的成员函数,加作用域可以访问到父类中的同名函数

非静态成员变量与静态成员变量处理方式一致,只不过静态成员变量有两种访问方式:

  1. 通过对象进行访问   例:s.fun();
  2. 通过类名进行访问   例:Son::Base::fun();

 代码示例

#include<iostream>
using namespace std;class Base{
public:Base(){m_A = 100;}void fun(){cout<<"Base 的 fun()"<<endl;}void fun(int ){cout<<"Base 的 fun(int)"<<endl;}int m_A;
};class Son : public Base{
public:Son(){m_A = 200;}void fun(){cout<<"Son 的 fun()"<<endl;}int m_A;};void test(){Son s;cout<<"m_A="<<s.m_A<<endl; //200cout<<"m_A="<<s.Base::m_A<<endl; //100,同名时,调用父类中的成员需要加作用域s.fun();s.Base::fun();s.Base::fun(1);  // 子类与父类拥有同名的成员函数时,子类会隐藏父类中所有版本的同名函数
}
int main(){test();return 0;
}

 六、多继承语法

语法:class  子类 :继承方式 父类1 , 继承方式  父类2,...

 代码示例

#include<iostream>
using namespace std;class Base1{
public:Base1(){m_A = 100;}int m_A;
};class Base2{
public:Base2(){m_A = 200;}int m_A;
};class son : public Base1,public Base2{
public:son(){m_B = 200;}int m_B;
};void test (){son s;cout<<"sizeof(s)"<<sizeof(s)<<endl;cout<<s.Base1::m_A<<endl; // 继承中出现同名时需要+作用域cout<<s.Base2::m_A<<endl;
}
int main(){test();
}

 七、菱形继承

 关键字:virtual

如下示例:加上virtual关键字后,Sleep和Tuo 两个类里的m_Age 存的是 vbptr(虚基类指针),指向各自的 vbtable(虚基类列表)。从而直接拿到Animal 中的m_Age,解决SleepTuo 拿到两份相同数据的问题。

代码示例

#include<iostream>
using namespace std;class Animal{
public:int m_Age;
};// 当子类继承两份相同的数据时:
// 继承前加上 virtual 关键字后,变为虚继承
// 此时公共的父类 Animal 称为虚基类
class Sleep : virtual public Animal{};
class tuo : virtual public Animal{};class SleepTuo : public Sleep , public tuo{};void test1(){SleepTuo y;y.Sleep::m_Age = 100;y.tuo::m_Age = 200;cout<<y.Sleep::m_Age<<endl;cout<<y.tuo::m_Age<<endl;cout<<y.m_Age<<endl;
}int main(){test1();
}

相关文章:

【C++】8___继承

目录 一、基本语法 二、继承方式 三、对象模型 四、继承中的构造与析构的顺序 五、继承中同名成员处理 六、多继承语法 七、菱形继承 一、基本语法 好处&#xff1a;减少重复的代码 语法&#xff1a; class 子类 &#xff1a; 继承方式 父类 子类 也称为 派生类 父类…...

C# 中的异常处理:构建健壮和可靠的程序

C#中的异常处理&#xff08;Exception Handling&#xff09;。异常处理是编程中非常重要的一部分&#xff0c;它允许开发者优雅地处理程序运行时可能出现的错误或意外情况。通过有效的异常处理&#xff0c;可以使应用程序更加健壮、可靠&#xff0c;并提供更好的用户体验。以下…...

基于智能合约的医院凭证共享中心路径探析

一、引言 随着医疗行业的不断发展和信息技术的进步&#xff0c;基于智能合约的医疗凭证共享中心解决方案成为了可能。在当今数字化时代&#xff0c;医疗领域面临着诸多挑战&#xff0c;如医疗数据的分散存储、信息共享的不便捷以及凭证管理的复杂性等问题。而智能合约的出现&am…...

vba学习系列(9)--按需求计数单元格数量

系列文章目录 文章目录 系列文章目录前言一、按需求计数单元格数量1.需求 二、使用步骤1.vba源码2.整理后 总结 前言 一、按需求计数单元格数量 1.需求 一个表中有多个类型的单元格内容&#xff0c;比如&#xff1a;文字、数字、特殊字符、字母数字…… 我们要计数字母数字的…...

scale index的计算

scale index定义 基本实现 需要注意&#xff0c;scale index的提出者分别构建了MATLAB和R语言的实现方式。 但是&#xff0c;需要注意&#xff0c;经过我向作者求证。 MATLAB编写的代码已经“过时了”&#xff0c;为了拥抱时代&#xff0c;作者构建了R语言包&#xff0c;名称为…...

鸿蒙实现Web组件开发

目录&#xff1a; 1、简介&使用场景2、加载网络页面3、加载本地页面4、加载HTML格式的文本数据5、设置深色模式6、上传文件7、在新窗口中打开页面8、管理位置权限 1、简介&使用场景 Web是一种基于互联网的技术和资源的网络服务系统。它是指由许多互连的计算机组成的全…...

Linux——linux系统移植

创建VSCode工程 1、将NXP官方的linux内核拷贝到Ubuntu 2、解压缩tar -vxjf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 NXP官方开发板Linux内核编译 1、将.vscode文件夹复制到NXP官网linux工程中&#xff0c;屏蔽一些不需要的文件 2、编译NXP官方EVK开发板对应的Linux系统…...

工业摄像头应对复杂环境的策略与解决方案

工业摄像头需应对复杂环境&#xff0c;如极端温度、振动、尘土、光照不足等。为确保稳定工作&#xff0c;它采用了先进技术和设计。详细分析如下&#xff1a; 一、增强环境适应性 采用高灵敏度传感器&#xff1a;使用CMOS或CCD图像传感器&#xff0c;适应低光照条件。 高精度、…...

重生之我在异世界学编程之C语言:深入动态内存管理篇

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一 动态内存管理的必要性二 动态…...

【经典论文阅读】Latent Diffusion Models(LDM)

Latent Diffusion Models High-Resolution Image Synthesis with Latent Diffusion Models 摘要 动机&#xff1a;在有限的计算资源下进行扩散模型训练&#xff0c;同时保持质量和灵活性 引入跨注意力层&#xff0c;以卷积方式实现对一般条件输入&#xff08;如文本或边界框…...

智能指针中的weak_ptr(弱引用智能指针)

弱引用智能指针 std::weak_ptr 可以看做是shared_ptr的助手,它不管理 shared_ptr 内部的指针。std::weak_ptr 没有重载操作符*和->&#xff0c;因为它不共享指针&#xff0c; 不能操作资源&#xff0c;所以它的构造不会增加引用计数&#xff0c;析构也不会减少引用计数,它的…...

【电子通识】机电继电器和固态继电器的区别

机电继电器 机电继电器于19世纪中叶发明。这些器件将线圈与可移动的金属触点结合使用来充当电动开关。这些器件会因为金属触点出现磨损而发生故障,例如焊死在一起。因此,在完全失效之前器件能够进行的开关周期数有限,从而限制了其总体可靠性。 一般情况下继电器控制…...

工业异常检测-CVPR2024-新的3D异常数据合成办法和自监督网络IMRNet

论文&#xff1a;https://arxiv.org/pdf/2311.14897v3.pdf 项目&#xff1a;https://github.com/chopper-233/anomaly-shapenet 这篇论文主要关注的是3D异常检测和定位&#xff0c;这是一个在工业质量检查中至关重要的任务。作者们提出了一种新的方法来合成3D异常数据&#x…...

如何创建对话窗口

文章目录 1. 概念介绍2. 使用方法3. 示例代码我们在上一章回中介绍了Dismissible Widget相关的内容,本章回中将介绍AlertDialog Widget.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们介绍的AlertDialog是指程序中弹出的确认窗口,其实我们在上一章回中删除ListView中…...

新手上路,学Go还是Python

对于新手来说&#xff0c;Go和Python都是很好的编程语言&#xff0c;它们各有特点&#xff0c;以下是详细的对比来帮助你决定先学哪一个&#xff1a; 一、语法和学习难度 Python 语法简洁易懂&#xff1a;Python以其简洁、优雅的语法而闻名&#xff0c;代码的可读性很高。例如…...

<!DOCTYPE html>的作用是什么

一、背景 从今天开始会不定时的发布一些前端的常见面试题&#xff0c;供大家参考。今天要发布的内容是关于html的面试题的作用是什么。接下来就一起讨论以下吧 二、概念 DOCTYPE 是html5中一种标准通用标记语言的文档类型的声明&#xff0c;它的目的就是为了告诉浏览器应该以…...

EasyExcel改名为FastExce做了那些改变呢

回到&#xff1a;github原作者地址&#xff1a;https://github.com/CodePhiliaX/fastexcel 中文 |English | 什么是 FastExcel FastExcel 是由原 EasyExcel 作者创建的新项目。2023 年我已从阿里离职&#xff0c;近期阿里宣布停止更新 EasyExcel&#xff0c;作者他本人决定继…...

狗狗的生育周期:关注与呵护

狗狗的繁殖是一个复杂且需要谨慎对待的过程&#xff0c;了解其生产周期对于宠物主人以及从事相关行业的人员至关重要。 一般而言&#xff0c;狗狗的怀孕周期约为两个月左右&#xff0c;但这并非绝对固定。从受孕到分娩&#xff0c;通常在 58 至 65 天之间波动。小型犬可能相对…...

ABAP DIALOG屏幕编程2

在上一篇博客ABAP DIALOG屏幕编程1中阐述了DIALOG、PBO、PAI的概念并且对常用页面元素怎么用进行了演示。在这一篇博文中会讲述怎么添加下拉框、搜索帮助&#xff0c;怎么创建表控件、屏幕跳转等。会用到上一篇里面的内容。 有关程序包含文件结构如下。 一、响应用户指令 如上…...

获取缓存大小与清除 Web 缓存 - 鸿蒙 HarmonyOS Next

针对浏览器 Web 组件清除缓存相关,具体实现如下 code 实例所示: /*公共方法类*/ export class PublicUtils {/*获取缓存大小*/static async getCacheSize(): Promise<number> {try {let bundleStats await storageStatistics.getCurrentBundleStats()let size bundleS…...

别再只调CLIP了!用Qwen2.5-VL的‘鹰之眼’搞定高清文档解析与长视频理解

Qwen2.5-VL&#xff1a;解锁工业级多模态理解的"鹰之眼"技术 在数字化转型浪潮中&#xff0c;企业每天需要处理海量的非结构化数据——从财务报表扫描件到生产线监控视频&#xff0c;从医疗影像到用户生成内容。传统AI模型在处理这些数据时&#xff0c;往往面临两大痛…...

Qwen3-ASR-1.7B保姆级教程:解决‘识别结果不准确’的5类高频问题

Qwen3-ASR-1.7B保姆级教程&#xff1a;解决‘识别结果不准确’的5类高频问题 1. 引言&#xff1a;为什么你的语音识别总是不准&#xff1f; 你是不是遇到过这样的情况&#xff1a;用语音识别软件录音&#xff0c;结果出来的文字乱七八糟&#xff0c;完全不是你说的内容&#…...

企业级Java SMB客户端:jcifs-ng深度架构解析与实战指南

企业级Java SMB客户端&#xff1a;jcifs-ng深度架构解析与实战指南 【免费下载链接】jcifs-ng A cleaned-up and improved version of the jCIFS library 项目地址: https://gitcode.com/gh_mirrors/jc/jcifs-ng jcifs-ng是一个经过彻底重构和优化的Java SMB客户端库&am…...

Cadence导出Gerber文件保姆级教程:从Database Check到嘉立创预览,一步不落

Cadence导出Gerber文件全流程实战&#xff1a;从设计验证到生产准备的深度指南 第一次在Cadence Allegro中导出Gerber文件时&#xff0c;那种面对几十个参数选项的手足无措感我至今记忆犹新。作为电子设计自动化(EDA)领域的工业标准工具&#xff0c;Cadence的强大功能背后是复杂…...

高分二号卫星全解析:从光谱波段到城市管理的实战应用

1. 高分二号卫星的技术参数详解 高分二号卫星作为我国首颗亚米级高分辨率民用光学遥感卫星&#xff0c;其技术参数直接决定了它在城市管理中的应用能力。先说说最核心的空间分辨率&#xff1a;全色波段0.8米意味着能清晰识别小轿车级别的物体&#xff0c;多光谱3.2米分辨率则适…...

**基于Python与Neo4j的知识图谱构建实践:从数据到语义网络的跃迁**在人工智能与大数据深度融合

基于Python与Neo4j的知识图谱构建实践&#xff1a;从数据到语义网络的跃迁 在人工智能与大数据深度融合的时代&#xff0c;知识图谱已成为智能问答、推荐系统、语义搜索等场景的核心基础设施。本文将围绕 Python Neo4j 构建一个小型但功能完整的知识图谱系统&#xff0c;带你完…...

Maven阿里云镜像配置详解:提升依赖下载速度的终极方案

Maven阿里云镜像配置实战&#xff1a;突破国内依赖下载瓶颈的完整指南 每次打开IDE准备大干一场时&#xff0c;最扫兴的莫过于看着Maven依赖下载进度条像蜗牛一样缓慢爬行。作为Java开发者&#xff0c;我们都经历过中央仓库下载速度只有几十KB/s的煎熬时刻——特别是当团队新成…...

任意偏振与圆偏振BIC光子晶体远场偏振计算:COMSOL中的直接画偏振态

任意偏振BIC&#xff0c;圆偏振BIC光子晶体远场偏振计算COMSOL直接画偏振态 最近在研究任意偏振BIC&#xff08;Bound states in the continuum&#xff09;和圆偏振BIC光子晶体的远场偏振计算&#xff0c;发现用COMSOL直接画偏振态还挺有意思的。今天就来聊聊这个&#xff0c…...

LED照明设计必看:TIR透镜在LightTools中的准直与均匀优化技巧

LED照明设计进阶&#xff1a;TIR透镜在LightTools中的高效准直与均匀优化实战 在LED照明设计领域&#xff0c;TIR&#xff08;全内反射&#xff09;透镜因其独特的光学特性已成为高端照明产品的核心组件。与传统的平凸透镜和反光杯相比&#xff0c;TIR透镜能够同时处理小角度和…...

Cursor Pro功能扩展工具:技术原理与开源解决方案

Cursor Pro功能扩展工具&#xff1a;技术原理与开源解决方案 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your trial re…...