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

c++继承(二)

一、友元函数的继承

友元函数不能被继承,就像爸爸的朋友不是你的朋友,如果要有友元函数,在子类重新定义一个。

二、静态成员的继承

静态成员的继承仍然是那个成员,普通成员的继承是不同的。

父类的静态成员属于当前类,也属于当前类的派生类。

三、单继承与多继承

1、单继承

一个子类只有一个直接父类

2、多继承

一个子类有两个或以上的直接父类

四、菱形继承

1、理解

如图 Assistant 就是一个菱形继承,显然如果不做特殊处理 Assistant 里面会有两份 Person 类中的成员,这就导致了数据冗余和二义性。

解决办法就是在菱形继承中父类被继承两次的地方进行虚继承virtual

被继承的 Person 类是虚基类。

2、剖析

(1)未用 virtual

class A
{
public:int _a;
};class B : public A
//class B : virtual public A
{
public:int _b;int _b1;int _b2;};class C : public A
//class C : virtual public A
{
public:int _c;
};
class D : public C, public B
{
public:int _d;
};int main()
{D d;d.B::_a = 1;d.C::_a = 2;//d._a = 0;d._b = 3;d._c = 4;d._d = 5;
}

上图就是典型的菱形继承且没有解决,这样在D类中我们发现两个_a是不一样的,要想使用必须指定类域,这就是数据冗余和二义性。

内存级理解:

明显的看到内存中D对象中的B,C存有不同的_a,这是不被允许的。

(2)用 virtual

class A
{
public:int _a;
};//class B : public A
class B : virtual public A
{
public:int _b;int _b1;int _b2;};//class C : public A
class C : virtual public A
{
public:int _c;
};
class D : public C, public B
{
public:int _d;
};int main()
{D d;d.B::_a = 1;d.C::_a = 2;d._a = 0;d._b = 3;d._c = 4;d._d = 5;
}

上图我们用虚继承解决了问题,此时类D中的_a是同一个_a,所以最后_a值应该是0

内存级理解:

首先B,C类中不再存有_a的值,而是用一个地址代替了,_a的值被放到了D对象的内存最下面,地址所指向的内容存放的是_a的值0,还有十六进制的偏移量,用来找到原内存中_a的存储位置。

这样就解决了问题。

(3)总结

a、存地址的偏移量是为了方便找到数据,方便切片。

b、虚继承的解决原理:把原来存父类成员的地方存地址,通过地址和偏移量找到唯一的父类成员。实现原来有几个类继承就有几份父类成员的数据冗余变成现在存几个地址和偏移量来找到内存中唯一的一份父类成员,解决了数据冗余和二义性。

c、对象的存储按声明顺序存储。

五、继承和组合

我们发现继承和组合都能复用之前的类,两者是相似的,在实践中两者也会一起使用。

//父类
class A {};//继承
class B : public A
{//直接继承,直接使用
};//组合
class C
{
private:A _aa;  //创建 A 对象,使用成员及方法
}
方式备注
继承is_a关系,白箱复用(在继承方式中,基类的 内部细节对子类可见 。继承一定程度破坏了基类的封装,基类的改变,对派生类有很大的影响)耦合度高。
组合has_a关系,黑箱复用(为对象的内部细节是不可见的)耦合度低。

优先使用组合,组合的耦合度低,代码维护性好。

相关文章:

c++继承(二)

一、友元函数的继承 友元函数不能被继承,就像爸爸的朋友不是你的朋友,如果要有友元函数,在子类重新定义一个。 二、静态成员的继承 静态成员的继承仍然是那个成员,普通成员的继承是不同的。 父类的静态成员属于当前类&#xf…...

低代码开发的崛起:机遇与挑战

近年来,“低代码”开发平台的迅速崛起,已经成为IT行业中不可忽视的趋势。这些平台承诺让非专业人士也能快速构建应用程序,通过减少代码编写的需求,大幅提高开发效率。对于许多企业而言,低代码开发工具成为了一个加速数…...

Json-JacksonUtils工具类

为了创建一个通用的 Jackson 工具类,我们可以定义一个名为 JacksonUtils 的工具类,该类将提 供多种方法来支持不同类型的 JSON 转换需求。下面是一个示例实现,包括基本的 JSON 到 Java 对象的转换、Java 对象到 JSON 的转换、以及更复杂的类型如 CommonResult 的转换。 C…...

svn客户端装完后没有svn.exe

如果SVN客户端(如TortoiseSVN)安装完成后,在预期的安装目录(通常是bin目录)中没有找到svn.exe文件,这通常是因为在安装过程中没有选择安装命令行客户端工具(Command Line Client Tools&#xff…...

TinyWebserver的复现与改进(4):主线程的具体实现

GitHub - yzfzzz/MyWebServer: Linux高并发服务器项目,参考了TinyWebServer,将在此基础上进行性能改进与功能增加。为方便读者学习,附带详细注释和博客! TinyWebserver的复现与改进(1):服务器环…...

DaemonSet 不能帮助我们做什么事情?

DaemonSet 不能帮助我们做什么事情? A. 保证集群内每一个(或者一些)节点都运行一组相同的Pod B. 跟踪集群节点状态,保证新加入的节点自动创建对应的Pod C. 跟踪集群节点状态,保证移除的节点删除对应的Pod D. 能够设置Pod重试次数,…...

开源模型应用落地-LangChain高阶-记忆组件-RedisChatMessageHistory正确使用(八)

一、前言 LangChain 的记忆组件发挥着至关重要的作用,其旨在协助大语言模型(LLM)有效地留存历史对话信息。通过这一功能,使得大语言模型在对话过程中能够更出色地维持上下文的连贯性和一致性,进而能够像人类的记忆运作方式那样,进行更为自然、流畅且智能化的交互。 它仿佛…...

解决Openwrt 串口默认是没有密码的方法

将串口登录加入密码方法如下: 步骤一:配置busybox的登录,可以在.config文件中添加如下 CONFIG_BUSYBOX_CONFIG_LOGINy 添加后,需要重新编译busybox。 步骤二:修改target/linux/ramips/base-files/etc/inittab文件 将…...

【vue讲解:v-model 之 lazy、number、trim、与后端交互、小电影案例】

2 v-model 之 lazy、number、trim lazy&#xff1a;等待input框的数据绑定时区焦点之后再变化 number&#xff1a;数字开头&#xff0c;只保留数字&#xff0c;后面的字母不保留&#xff1b;字母开头&#xff0c;都保留 trim&#xff1a;去除首位的空格<!DOCTYPE html> …...

ECCV 2024 | 南洋理工三维数字人生成新范式:结构扩散模型

该论文作者均来自于新加坡南洋理工大学 S-Lab 团队&#xff0c;包括博士后胡涛&#xff0c;博士生洪方舟&#xff0c;以及计算与数据学院刘子纬教授&#xff08;《麻省理工科技评论》亚太地区 35 岁以下创新者&#xff09;。S-Lab 近年来在顶级会议如 CVPR, ICCV, ECCV, NeurIP…...

2024.8.13-算法学习(原创+转载)

一、什么是张量并行&#xff08;Tensor Parallelism&#xff09; &#xff1f; 张量并行&#xff08;Tensor Parallelism&#xff09; 是一种分布式矩阵算法。 随着模型越来越大&#xff0c;模型内的矩阵也越来越大。一个大矩阵的乘法可以拆分成多个小矩阵的运算&#xff0c;…...

beautifulsoup的简单使用

文章目录 beautifulsoup一. beautifulsoup的简单使用1、安装2、如何使用3、对象的种类 二、beautifulsoup的遍历文档树2.1 子节点.contents 和 .children descendants2.2 节点内容.string.text 2.3 多个内容.strings**.stripped_strings** 2.4 父节点.parent.parents 三、beaut…...

【Python】Jupyter Notebook的安装及简单使用

Jupyter Notebook的安装及简单使用1、安装2、language设置为中文3、Jupyter Notebook启动4、Jupyter Notebook的常用快捷方式5、将Notebook笔记转为其他文件格式保存 Jupyter Notebook的安装及简单使用 不安装AnaCoda&#xff0c;但需要使用Jupyter Notebook 1、安装 pip inst…...

中国自动驾驶出租车冲击网约车市场

近年来&#xff0c;中国的自动驾驶技术迅速发展&#xff0c;对传统网约车市场构成了越来越大的冲击。随着科技巨头百度旗下的萝卜快跑等公司加速推广无人驾驶出租车&#xff0c;这一趋势引发了广泛的讨论和担忧。 自动驾驶技术的迅猛发展 中国自动驾驶行业正处于快速发展阶段&…...

解决浏览器书签同步问题,极空间部署开源免费的跨平台书签同步工具『xBrowserSync』

解决浏览器书签同步问题&#xff0c;极空间部署开源免费的跨平台书签同步工具『xBrowserSync』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 作为一个喜欢折腾的数码党&#xff0c;我平时上网冲浪使用的浏览器绝不会只限于一种&#xff0c;就比如说我在上班的地方只会用到Edge浏…...

14个SpringBoot优化小妙招

今天我们来分享一下平时用SpringBoot开发时候的一些优化小妙招&#xff0c;用好这些优化小妙招让我们开发的系统架构、系统代码、开发流程、测试流程、运维监控看起来就跟写诗一样优雅&#xff0c;让我们每个人手头负责的代码和工程都要很漂亮~~~ 这里的优化小妙招很多不是说直…...

Elasticsearch 度量(Metric)聚合详解及示例

Elasticsearch 提供了强大的聚合功能&#xff0c;允许用户对数据进行深入的统计分析。度量&#xff08;Metric&#xff09;聚合是其中一种&#xff0c;它用于对数值型数据进行计算&#xff0c;如求和、平均值、最大值、最小值等。本文将详细介绍 Elasticsearch 的度量聚合&…...

基于 jsp 的健身俱乐部会员系统设计与实现

点击下载源码 基于 jsp 的健身俱乐部会员系统设计与实现 摘 要 目前我国虽然己经开发出了应用计算机操作的健身俱乐部管理系统&#xff0c;但管理软件&#xff0c;管理方法和管理思想三者往往相脱节。造成我国健身俱乐部信息管理系统极端化的缺陷。在国外健身俱乐部已经有了一…...

苍穹外卖项目DAY01

苍穹外卖项目Day01 1、软件开发整体介绍 1.1、软件开发流程 1.2、角色分工 项目经理&#xff1a;对整个项目负责&#xff0c;任务分配、把控进度产品经理&#xff1a;进行需求调研&#xff0c;输出需求调研文档、产品原型等UI设计师&#xff1a;根据产品原型输出界面效果图架…...

SpringBoot(Ⅰ)——HelloWorld和基本打包部署+Pom依赖概述+@SpringBootApplication注解+自动装配原理+约定大于配置

前言 如果SSM学的比较好&#xff0c;那么SpringBoot说白了就两件事:约定大于配置和自动装配 SpringBoot不会提供任何的功能拓展&#xff0c;完全依赖我们手动添加 所以SpringBoot的本质是一个依赖脚手架&#xff0c;可以快速集成配置各种依赖 1.1 SpringBoot相关依赖 创建…...

GHelper:华硕笔记本性能优化与硬件控制的开源解决方案

GHelper&#xff1a;华硕笔记本性能优化与硬件控制的开源解决方案 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Sc…...

2026年OpenClaw部署攻略:新手友好部署、配置大模型百炼APIKey、集成Skill详细步骤

2026年OpenClaw部署攻略&#xff1a;新手友好部署、配置大模型百炼APIKey、集成Skill详细步骤。OpenClaw&#xff08;原Clawdbot&#xff09;作为2026年主流的AI自动化助理平台&#xff0c;可通过阿里云轻量服务器实现724小时稳定运行&#xff0c;并快速接入钉钉&#xff0c;让…...

终极指南:3步解锁原神帧率限制,体验144Hz流畅游戏

终极指南&#xff1a;3步解锁原神帧率限制&#xff0c;体验144Hz流畅游戏 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock genshin-fps-unlock是一款专为《原神》PC玩家设计的帧率解锁工具…...

别再为ChatTTS声音飘忽发愁了!手把手教你用Python代码+高质量.pt音色文件,生成稳定语音

用Python和优质音色文件打造稳定语音合成体验 语音合成技术正在改变内容创作的方式&#xff0c;但很多开发者在实际使用ChatTTS时都会遇到一个共同的困扰——生成的语音音色飘忽不定&#xff0c;每次输出都像开盲盒。这种不稳定性严重影响了专业场景下的使用体验&#xff0c;比…...

ESP8266与STM32F103通信实战:从硬件连接到软件调试的完整解析

1. ESP8266与STM32F103通信基础 搞物联网开发的朋友应该都听说过ESP8266这个神器&#xff0c;它就像给传统单片机装上了Wi-Fi翅膀。我最早用STM32F103做项目时&#xff0c;为了联网功能折腾了好久&#xff0c;直到发现ESP-01S模块这个性价比之王。今天我就把这两者的通信实战经…...

插件语言转换解决方案:让Obsidian插件无缝支持中文界面

插件语言转换解决方案&#xff1a;让Obsidian插件无缝支持中文界面 【免费下载链接】obsidian-i18n 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-i18n obsidian-i18n&#xff08;国际化缩写&#xff09;是一款专为中文用户设计的Obsidian插件翻译工具&#…...

ai赋能c语言开发:让快马平台自动生成文件io与链表管理代码

AI赋能C语言开发&#xff1a;让快马平台自动生成文件IO与链表管理代码 最近在做一个C语言的通讯录管理系统项目&#xff0c;需要实现联系人信息的增删改查功能&#xff0c;并且要求数据能够持久化保存。作为一个有经验的开发者&#xff0c;我决定尝试用InsCode(快马)平台的AI辅…...

跨平台资源下载终极指南:一键获取视频号、抖音、快手等全网资源

跨平台资源下载终极指南&#xff1a;一键获取视频号、抖音、快手等全网资源 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 在…...

ComfyUI-VideoHelperSuite全流程掌控:解锁10倍视频处理效率

ComfyUI-VideoHelperSuite全流程掌控&#xff1a;解锁10倍视频处理效率 【免费下载链接】ComfyUI-VideoHelperSuite Nodes related to video workflows 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-VideoHelperSuite 构建高效视频工作流 环境部署与基础配置 …...

Automerge与区块链技术结合:构建去中心化数据协作的终极指南

Automerge与区块链技术结合&#xff1a;构建去中心化数据协作的终极指南 【免费下载链接】automerge A JSON-like data structure (a CRDT) that can be modified concurrently by different users, and merged again automatically. 项目地址: https://gitcode.com/gh_mirr…...