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

C++中的继承方式

目录

摘要

1. 公有继承(Public Inheritance)

2. 保护继承(Protected Inheritance)

3. 私有继承(Private Inheritance)

4. 多重继承(Multiple Inheritance)

继承列表的项数


摘要

在 C++ 中,继承是一种让一个类(派生类)从另一个类(基类)获得属性和方法的机制。我们在之前有通过这篇文章有聊到过继承的一些简单知识(C++中的封装,继承和多态-CSDN博客)。下面我们将继续介绍一些在实际项目中常用到的一些继承的方式。

1. 公有继承(Public Inheritance):基类的公有成员和保护成员在派生类中保持其访问权限,公有成员在派生类中仍然是公有的,保护成员在派生类中仍然是保护的。
2. 保护继承(Protected Inheritance):基类的公有成员和保护成员在派生类中都变成保护成员。
3. 私有继承(Private Inheritance):基类的公有成员和保护成员在派生类中都变成私有成员。

此外,C++ 还支持 多重继承(Multiple Inheritance),即一个类可以从多个基类继承。继承列表中的项数理论上没有限制,但过多的继承会导致代码复杂性增加和维护难度上升。

1. 公有继承(Public Inheritance)

在公有继承中,基类的公有成员在派生类中保持为公有成员,保护成员保持为保护成员,而私有成员仍然是私有的。

#include <iostream>
using namespace std;class Base {
public:void publicMethod() { cout << "Base public method" << endl; }
protected:void protectedMethod() { cout << "Base protected method" << endl; }
private:void privateMethod() { cout << "Base private method" << endl; }
};class DerivedPublic : public Base {
public:void derivedMethod() {publicMethod();        // 可以访问protectedMethod();     // 可以访问// privateMethod();    // 无法访问}
};int main() {DerivedPublic obj;obj.publicMethod();        // 可以访问// obj.protectedMethod();  // 无法访问// obj.privateMethod();    // 无法访问obj.derivedMethod();return 0;
}

2. 保护继承(Protected Inheritance)

在保护继承中,基类的公有成员和保护成员在派生类中都变成保护成员,而私有成员仍然是私有的。

#include <iostream>
using namespace std;class Base {
public:void publicMethod() { cout << "Base public method" << endl; }
protected:void protectedMethod() { cout << "Base protected method" << endl; }
private:void privateMethod() { cout << "Base private method" << endl; }
};class DerivedProtected : protected Base {
public:void derivedMethod() {publicMethod();        // 可以访问protectedMethod();     // 可以访问// privateMethod();    // 无法访问}
};int main() {DerivedProtected obj;// obj.publicMethod();     // 无法访问// obj.protectedMethod();  // 无法访问obj.derivedMethod();return 0;
}

3. 私有继承(Private Inheritance)

在私有继承中,基类的公有成员和保护成员在派生类中都变成私有成员,而私有成员仍然是私有的。

#include <iostream>
using namespace std;class Base {
public:void publicMethod() { cout << "Base public method" << endl; }
protected:void protectedMethod() { cout << "Base protected method" << endl; }
private:void privateMethod() { cout << "Base private method" << endl; }
};class DerivedPrivate : private Base {
public:void derivedMethod() {publicMethod();        // 可以访问protectedMethod();     // 可以访问// privateMethod();    // 无法访问}
};int main() {DerivedPrivate obj;// obj.publicMethod();     // 无法访问// obj.protectedMethod();  // 无法访问obj.derivedMethod();return 0;
}

4. 多重继承(Multiple Inheritance)

在多重继承中,一个派生类可以从多个基类继承。需要注意的是,多重继承可能会带来名字冲突和菱形继承等问题,需要小心处理。

#include <iostream>
using namespace std;class Base1 {
public:void methodBase1() { cout << "Base1 method" << endl; }
};class Base2 {
public:void methodBase2() { cout << "Base2 method" << endl; }
};class DerivedMultiple : public Base1, public Base2 {
public:void derivedMethod() {methodBase1();methodBase2();}
};int main() {DerivedMultiple obj;obj.methodBase1();obj.methodBase2();obj.derivedMethod();return 0;
}

继承列表的项数

理论上,继承列表的项数没有限制 -- 多重继承:

#include <iostream>
using namespace std;class Base1 {
public:void methodBase1() { cout << "Base1 method" << endl; }
};class Base2 {
public:void methodBase2() { cout << "Base2 method" << endl; }
};class Base3 {
public:void methodBase3() { cout << "Base3 method" << endl; }
};class DerivedMultiple : public Base1, public Base2, public Base3 {
public:void derivedMethod() {methodBase1();methodBase2();methodBase3();}
};int main() {DerivedMultiple obj;obj.methodBase1();obj.methodBase2();obj.methodBase3();obj.derivedMethod();return 0;
}

相关文章:

C++中的继承方式

目录 摘要 1. 公有继承&#xff08;Public Inheritance&#xff09; 2. 保护继承&#xff08;Protected Inheritance&#xff09; 3. 私有继承&#xff08;Private Inheritance&#xff09; 4. 多重继承&#xff08;Multiple Inheritance&#xff09; 继承列表的项数 摘要…...

Vue进阶之Vue无代码可视化项目(四)

Vue无代码可视化项目 左侧栏第一步LeftPanel.vueLayoutView.vuebase.css第二步LayoutView.vueLeftPanel.vue编排引擎smooth-dnd安装创建文件SmoothDndContainer.tsutils.tsSmoothDndDraggable.tsLeftPanel.vue左侧栏 第一步 创建LeftPanel LeftPanel.vue <script setup…...

day40--Redis(二)实战篇

实战篇Redis 开篇导读 亲爱的小伙伴们大家好&#xff0c;马上咱们就开始实战篇的内容了&#xff0c;相信通过本章的学习&#xff0c;小伙伴们就能理解各种redis的使用啦&#xff0c;接下来咱们来一起看看实战篇我们要学习一些什么样的内容 短信登录 这一块我们会使用redis共…...

使用Ollama+OpenWebUI本地部署Gemma谷歌AI开放大模型完整指南

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;AI大模型部署与应用专栏&#xff1a;点击&#xff01; &#x1f916;Ollama部署LLM专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月4日10点50分 &#x1f004;️文章质量&#xff1…...

react的自定义组件

// 自定义组件(首字母必须大写) function Button() {return <button>click me</button>; } const Button1()>{return <button>click me1</button>; }// 使用组件 function App() {return (<div className"App">{/* // 自闭和引用自…...

海宁代理记账公司-专业的会计服务

随着中国经济的飞速发展&#xff0c;企业的规模和数量日益扩大&#xff0c;在这个过程中&#xff0c;如何保证企业的财务活动合规、准确无误地进行&#xff0c;成为了每个企业面临的重要问题&#xff0c;专业、可靠的代理记账公司应运而生。 海宁代理记账公司的主要职责就是为各…...

matlab 计算三维空间点到直线的距离

目录 一、算法原理二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 直线的点向式方程为: x − x 0 m = y...

YOLOv5车流量监测系统研究

一. YOLOv5算法详解 YOLOv5网络架构 上图展示了YOLOv5目标检测算法的整体框图。对于一个目标检测算法而言&#xff0c;我们通常可以将其划分为4个通用的模块&#xff0c;具体包括&#xff1a;输入端、基准网络、Neck网络与Head输出端&#xff0c;对应于上图中的4个红色模块。Y…...

单元测试覆盖率

什么是单元测试覆盖率 关于其定义&#xff0c;先来看一下维基百科上的一段描述&#xff1a; 代码覆盖&#xff08;Code coverage&#xff09;是软件测试中的一种度量&#xff0c;描述程序中源代码被测试的比例和程度&#xff0c;所得比例称为代码覆盖率。 简单来理解&#xff…...

逻辑这回事(三)----时序分析与时序优化

基本时序参数 图1.1 D触发器结构 图1.2 D触发器时序 时钟clk采样数据D时&#xff0c;Tsu表示数据前边沿距离时钟上升沿的时间&#xff0c;MicTsu表示时钟clk能够稳定采样数据D的所要求时间&#xff0c;Th表示数据后边沿距离时钟上升沿的时间&#xff0c;MicTh表示时钟clk采样…...

[JAVASE] 类和对象(二) -- 封装

目录 一. 封装 1.1 面向对象的三大法宝 1.2 封装的基本定义与实现 二. 包 2.1 包的定义 2.2 包的作用 2.3 包的使用 2.3.1 导入类 2.3.2 导入静态方法 三. static 关键字 (重要) 3.1 static 的使用 (代码例子) 3.1.1 3.1.2 3.1.3 3.1.4 四. 总结 一. 封装 1.1 面向对象…...

开发网站,如何给上传图片的服务器目录授权

开发网站&#xff0c;上传图像时提示”上传图片失败&#xff0c;Impossible to create the root directory /var/www/html/xxxxx/public/uploads/avatar/20240608.“ 在Ubuntu上&#xff0c;你可以通过调整文件夹权限来解决这个问题。首先&#xff0c;确保Web服务器&#xff08…...

特别名词Test Paper2

特别名词Test Paper2 cabinet 橱柜cable 电缆&#xff0c;有线电视cafe 咖啡厅cafeteria 咖啡店&#xff0c;自助餐厅cage 笼子Cambridge 剑桥camel 骆驼camera 相机camp 露营campus 校园candidate 候选人&#xff0c;考生candle 蜡烛canteen 食堂capital 资金&#xff0c;首都…...

数据结构-AVL树

目录 二叉树 二叉搜索树的查找方式&#xff1a; AVL树 AVL树节点的实现 AVL树节点的插入操作 AVL树的旋转操作 右旋转&#xff1a; 左旋转&#xff1a; 左右双旋&#xff1a; 右左双旋&#xff1a; AVL树的不足和下期预告&#xff08;红黑树&#xff09; 二叉树 了…...

数字科技如何助力博物馆设计,强化文物故事表现力?

国际博物馆日是每年为了推广博物馆和文化遗产&#xff0c;而设立的一个特殊的日子&#xff0c;让我们可以深入探讨博物馆如何更好地呈现和保护我们的文化遗产&#xff0c;随着近年来的数字科技发展&#xff0c;其在博物馆领域的应用越来越广泛&#xff0c;它为博物馆提供了新的…...

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第七周) - 结构化预测

结构化预测 0. 写在大模型前面的话1. 词法分析 1.1. 分词1.2. 词性标注 2.2. 句法分析 2.3. 成分句法分析2.3. 依存句法分析 3. 序列标注 3.1. 使用分类器进行标注 4. 语义分析 0. 写在大模型前面的话 在介绍大语言模型之前&#xff0c;先把自然语言处理中遗漏的结构化预测补…...

5-Maven-setttings和pom.xml常用配置一览

5-Maven-setttings和pom.xml常用配置一览 setttings.xml配置 <?xml version"1.0" encoding"UTF-8"?> <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xs…...

input输入框设置样式

input清除自带样式 input, textarea,label, button,select,img,form,table,a{-webkit-tap-highlight-color: rgba(255,255,255,0);-webkit-tap-highlight-color: transparent;margin: 0;padding: 0;border: none; } /*去除iPhone中默认的input样式*/ input, button, select, t…...

平稳交付 20+ 医院,卓健科技基于 OpenCloudOS 的落地实践

导语&#xff1a;随着数字化转型于各个行业领域当中持续地深入推进&#xff0c;充当底层支撑的操作系统正发挥着愈发关键且重要的作用。卓健科技把 OpenCloudOS 当作首要的交付系统&#xff0c;达成了项目交付速度的提升、安全可靠性的增强、运维成本的降低。本文将会阐述卓健科…...

Python下载库

注&#xff1a;本文一律使用windows讲解。 一、使用cmd下载 先用快捷键win R打开"运行"窗口&#xff0c;如下图。 在输入框中输入cmd并按回车Enter或点确定键&#xff0c;随后会出现这个画面&#xff1a; 输入pip install 你想下载的库名&#xff0c;并按回车&…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...