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

C++:公有,保护及私有继承

        从已有的类派生出新的类,而派生类继承了原有类的特征被称为类继承。下面按照访问权限分别介绍公有继承,私有继承与保护继承。

公有继承

        使用公有继承,基类的公有成员将成为派生类的公有成员(派生类对象可直接调用方法),基类的私有成员也将成为派生类的一部分,但只能通过基类的公有方法和保护方法访问。

class ttp{
private:string firstname;bool table;
public:ttp{string&fn,bool ht);void Name() const;
};//定义基类
//下面使用公有继承
class rpr:public ttp
{
private:usigned int rating;
public:rpr(usigned int r,string&fn,bool ht);rpr(usigned int r,ttp&tp);
}

        因为派生类只能通过基类的公有或保护方法访问基类私有数据,所以两个构造函数代码如下

rpr::rpr(usigned int r,string&fn,bool ht):ttp(fn,ht)//派生类构造函数将数据传给基类构造函数,创建一个嵌套的ttp对象
{rating=r
}
rpr::rpr(usigned int r,ttp&tp):ttp(tp)
{rating=r;    //也可使用列表初始化
}//调用复制构造函数

         若无显式调用的基类构造函数,则程序将调用默认的基类构造函数。最后对象过期时会先调用派生类的析构函数,再调用基类的析构函数。

基类与派生类的特殊关系
  • 基类指针和引用可以在不进行显式转换类型的情况下指向派生类对象。(但只能用于调用基类方法)
  • 可以用派生类对象为基类对象初始化。
  • 可以将派生类对象赋值给基类对象。 

私有继承与包含(类)

        我们可以在类中嵌套其他的类,这种行为称为包含。下面设计一个student类来做相关介绍。

class student
{
private:string name;             //使用string类记录名字valarray<double> scores;//使用valarray类模板记录分数
pubic:student():name("Null student"),scores(){}explict student(int n):name("Nully"),scores(n){}    //explict阻止隐式转换explict student(const std::string&s):name(s),scores(){}    //注意名称空间...
}

        上述类将数据成员声明为私有,这意味着student类的成员函数可以使用string类和valarray类的公有接口(对应对象调用)来访问和修改name和score对象。注意区分继承和包含的列表初始化,继承使用类名调用对应的基类构造函数,包含则使用成员名进行初始化

hasDMA::hasDMA(cosnt hasDMA&hs):baseDMA(hs){}//继承,使用基类类名explict student(const std::string&s):name(s),scores(){}//包含,使用成员名
//这里scores()可以省去,自动调用默认构造函数

 注:列表初始化的顺序不是列表的顺序,而是数据被声明的顺序。

        同样也可以使用私有继承来实现上述功能。使用私有继承,基类的公有方法将成为派生类的私有方法。

class student:private std::string,private std::valarray<double>
{
private:typedef std::valarray<double> ADb;
public:student():std::string("Null student"){}explict student(int n):std::string("Nully"),ADb(n){}explict student(const std::string&s):std::string(s),ADb(){}//使用类名初始化,即调用基类构造函数...
}

         包含时将使用对象名来调用方法,而使用私有继承时将使用类名和作用域解析运算符来调用方法。

double student::average() const
{if(scores.size()>0)return scores.sum()/scores.size();elsereturn 0;
}//包含
double student::average() const
{if(ADb::size()>0)return ADb::sum()/ADb::size();elsereturn 0;
}//私有继承

        访问基类对象可以通过使用强制类型转换来实现

const string&student::Name() const
{return (const string&) *this;
}
ostream & operator<<(ostream & os,const student&stu)
{oa<<"scores for"<<(const string&)stu<<"\n";    //强制类型转换,调用string的友元函数
}

         注意,在私有继承中,未进行显式类型转换的派生类引用或指针,无法赋值给基类的引用或指针。但该例中即使是公有继承也需要显式类型转换,因为这里使用了多重继承,编译器无法确定应转换为哪个基类。

使用包含还是私有继承

        包含和私有继承都可以实现has-a关系,那么改如何选择呢?大多C++程序倾向于使用包含,因为它更加易于理解且能包含多个同类的子对象。但如果涉及到访问类的保护成员或重新定义虚函数,应选择使用私有继承。

保护继承

         保护继承是私有继承的变体。使用保护继承时,基类的公有成员和保护成员都将成为派生类的保护成员。保护成员在类中访问权限与私有成员相同,但在继承中,基类的保护成员可以被派生类直接访问。

class student:protected std::string,protected std::valarray<double>
{
...
};

         所以使用私有继承时,第三代类不能使用基类的接口,因为基类的公有和保护成员成为了第二代类的私有成员。而使用保护继承时,第三代类可以使用基类的接口,因为基类的公有成员和保护成员都成为了第二代类的保护成员。

        下面对三种继承方式做一个总结

各种继承方式
特征公有继承保护继承私有继承
公有成员变成派生类的公有成员派生类的保护成员派生类的私有成员
保护成员变成派生类的保护成员派生类的保护成员派生类的私有成员
私有成员变成只能通过基类接口访问只能通过基类接口访问只能通过基类接口访问
能否隐式向上转换是(但只能在派生类中)

使用using重新定义访问权限

        使用保护继承或是私有继承时,如果想要基类的方法在派生类外可用有两种方法。第一种是定义一个使用该基类方法的派生类方法

double student::sum() const
{return std::valarray<double>::sum();
}//使用私有继承方法

        第二种则是将函数调用包装在另一个函数调用中,即使用using声明来指出派生类可以使用特定的基类成员,即使采用的是基类派生。

class student::private std::string,private std::valarray<double>
{
...
public:using std::valarray<double>::min;using std::valarray<double>::max;using std::valarray<double>::operator[];
...
};

        上述using语句使得min(),max()函数以及重载运算符[ ]可用。使用using声明时只使用函数名(即不包括圆括号,特征标和返回类型)。

相关文章:

C++:公有,保护及私有继承

从已有的类派生出新的类&#xff0c;而派生类继承了原有类的特征被称为类继承。下面按照访问权限分别介绍公有继承&#xff0c;私有继承与保护继承。 公有继承 使用公有继承&#xff0c;基类的公有成员将成为派生类的公有成员&#xff08;派生类对象可直接调用方法&#xff09…...

ElasticSearch聚合操作案例

1、根据color分组统计销售数量 只执行聚合分组&#xff0c;不做复杂的聚合统计。在ES中最基础的聚合为terms&#xff0c;相当于 SQL中的count。 在ES中默认为分组数据做排序&#xff0c;使用的是doc_count数据执行降序排列。可以使用 _key元数据&#xff0c;根据分组后的字段数…...

使用 OAuth 2.0 保护 REST API

使用 OAuth 2.0 保护 REST API 使用 OAuth 2.0 保护 REST API1.1 不安全的api1.2 安全默认值安全默认值Spring Security 默认值 需要对所有请求进行身份验证Servlet、过滤器和调度程序安全优势 使用所有请求的安全标头进行响应缓存标头 严格传输安全标头内容类型选项需要对所有…...

解决下拉框数据提交后回显名称不对

问题背景描述 页面组件使用 antd 的 Select 组件&#xff0c;下拉框的 options 数据是动态获取的&#xff0c;基本就是有value 和 label 属性的对象数组。 提交数据后&#xff0c;我们有一个保存草稿的操作&#xff0c;支持返回或者刷新页面&#xff0c;浏览其他页面之后通过其…...

lenis滑动插件的笔记

官网 lenis - npm 方法一&#xff1a;基础判断&#xff08;推荐&#xff09; 通过 Lenis 自带的 scroll 和 limit 属性直接判断&#xff1a; const lenis new Lenis()// 滚动事件监听 lenis.on(scroll, ({ scroll, limit }) > {const distanceToBottom limit - scroll…...

基于Python的高效批量处理Splunk Session ID并写入MySQL的解决方案

已经用Python实现对Splunk通过session id获取查询数据&#xff0c;现在要实现Python批量数据获取&#xff0c;通过一个列表中的大量Session ID&#xff0c;快速高效地获取一个数据表&#xff0c;考虑异常处理&#xff0c;多线程和异步操作以提高性能&#xff0c;同时将数据表写…...

Android Framework

Android 分区 /boot&#xff1a;存放引导程序&#xff0c;包括内核和内存操作程序。/system&#xff1a;相当于电脑 C 盘&#xff0c;存放 Android 系统及系统应用。/recovery&#xff1a;恢复分区&#xff0c;可以进入该分区进行系统恢复。/data&#xff1a;用户数据区&#…...

JVM对象分配与程序崩溃排查

一、new 对象在 JVM 中的过程 在 JVM 中通过 new 关键字创建对象时&#xff0c;会经历以下步骤&#xff1a; 内存分配 对象的内存分配在 堆&#xff08;Heap&#xff09; 中&#xff0c;优先在 新生代&#xff08;Young Generation&#xff09; 的 Eden 区 分配。分配方式取决…...

OpenMCU(六):STM32F103开发板功能介绍

概述 距上一篇关于STM32F103的FreeRTOS博客的发布已经过去很长时间没有更新了。在这段时间内&#xff0c;大家可以看到博主发表了一系列的关于使用qemu 模拟实现STM32F103的博客&#xff0c;博主本来想借助qemu开发stm32F103相关的一些软件功能&#xff0c;博主开发出来并成功运…...

(自用)Java学习-5.12(Redis,B2C电商)

一、Redis 核心知识 缓存作用 提升性能&#xff1a;内存读写速度&#xff08;读 10w/s&#xff0c;写 8w/s&#xff09;远超 MySQL&#xff08;读 3w/s&#xff0c;写 2w/s&#xff09;减少数据库压力&#xff1a;通过内存缓存热点数据&#xff0c;避免频繁 SQL 查询分类&#…...

Rspack:字节跳动自研 Web 构建工具-基于 Rust打造高性能前端工具链

字节跳动开源了一款采用 Rust 开发的前端模块打包工具&#xff1a;Rspack&#xff08;读音为 /ɑrspk/&#xff09;。 据介绍&#xff0c;Rspack 是一个基于 Rust 的高性能构建引擎&#xff0c;具备与 Webpack 生态系统的互操作性&#xff0c;可以被 Webpack 项目低成本集成&a…...

深度解析LLM参数:Top-K、Top-p和温度如何影响输出随机性?

许多大模型具有推理参数&#xff0c;用于控制输出的“随机性”。常见的几个是 Top-K、Top-p&#xff0c;以及温度。 Top-p&#xff1a; 含义&#xff1a;Kernel sampling threshold. Used to determine the randomness of the results. The higher the value, the stronger t…...

高速系统设计实例设计分析

在上几章的内容中&#xff0c;我们从纯粹高速信号的理论分析&#xff0c;到 Cadence 工具的具体使用都做了详细的讲解和介绍。相信读者通过前面章节的学习&#xff0c;已经对高速系统的设计理念及 Cadence 相应的设计流程和工具有了一个基本的认识。但是&#xff0c;对于高速电…...

查看购物车

一.查看购物车 查看购物车使用get请求。我们要查看当前用户的购物车&#xff0c;就要获取当前用户的userId字段进行条件查询。因为在用户登录时就已经将userId封装在token中了&#xff0c;因此我们只需要解析token获取userId即可&#xff0c;不需要前端再传入参数了。 Control…...

疑难杂症:dex安装部署

方式一、源码包下载 wget https://github.com/dexidp/dex/archive/refs/tags/v2.42.1.tar.gz 方式二、git方式拉取源码编译&#xff1a; Getting Started | $ git clone https://github.com/dexidp/dex.git 编译 $ cd dex/ $ make build 启动 ./bin/dex serve examples/…...

【idea】快捷键ctrl+shift+F(Find in files)不起作用

问题描述 在idea中使用快捷键CtrlShiftF&#xff0c;进行内容的搜索&#xff0c;但是弹不出对话框、或有时候能弹出有时候又弹不出。 原因分析 1.怀疑是缓存问题&#xff1f;--清空缓存重启也没什么作用 2.怀疑是idea的问题&#xff1f;--有时行、有时不行&#xff0c;而且…...

开发工具分享: Web前端编码常用的在线编译器

1.OneCompiler 工具网址&#xff1a;https://onecompiler.com/ OneCompiler支持60多种编程语言&#xff0c;在全球有超过1280万用户&#xff0c;让开发者可以轻易实现代码的编写、运行和共享。 OneCompiler的线上调试功能完全免费&#xff0c;对编程语言的覆盖也很全&#x…...

EnumUtils:你的枚举“变形金刚“——让枚举操作不再手工作业

各位枚举操控师们好&#xff01;今天要介绍的是Apache Commons Lang3中的EnumUtils工具类。这个工具就像枚举界的"瑞士军刀"&#xff0c;能让你的枚举操作从石器时代直接跃迁到星际文明&#xff01; 一、为什么需要EnumUtils&#xff1f; 手动操作枚举就像&#xf…...

智启未来:新一代云MSP管理服务助力企业实现云成本管理和持续优化

在数字化转型浪潮下&#xff0c;企业纷纷寻求更高效、更经济的运营方式。随着云计算技术的深入应用&#xff0c;云成本优化已成为企业普遍关注的核心议题。 过去&#xff0c;传统云运维服务往往依赖于人力外包&#xff0c;缺乏系统性、规范性的管理&#xff0c;难以有效降低云…...

window 显示驱动开发-将虚拟地址映射到内存段(二)

在将虚拟地址映射到段的一部分之前&#xff0c;视频内存管理器调用显示微型端口驱动程序的 DxgkDdiAcquireSwizzlingRange 函数&#xff0c;以便驱动程序可以设置用于访问可能重排的分配位的光圈。 驱动程序既不能将偏移量更改为访问分配的 PCI 光圈&#xff0c;也不能更改分配…...

C++:构造函数

构造函数是类的六个默认成员函数之一&#xff0c;这里的默认是指我们不写&#xff0c;编译器会自己生成的。 构造函数其目的是初始化对象&#xff0c;不是开空间。 其特征如下&#xff1a; 1.函数名与类名相同 2.没有返回值&#xff0c;意思是不用在函数前面写void。 3.对…...

【文心智能体】使用文心一言来给智能体设计一段稳定调用工作流的提示词

&#x1f339;欢迎来到《小5讲堂》&#x1f339; &#x1f339;这是《文心智能体》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。&#x1f339; &#x1f339;温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff0…...

K8S中构建双架构镜像-从零到成功

背景介绍 公司一个客户的项目使用的全信创的环境&#xff0c;服务器采用arm64的机器&#xff0c;而我们的应用全部是amd64的&#xff0c;于是需要对现在公司流水线进行arm64版本的同步镜像生成。本文介绍从最开始到最终生成双架构的全部过程&#xff0c;以及其中使用的相关配置…...

pth的模型格式怎么变成SafeTensors了?

文章目录 背景传统模型格式的安全隐患效率与资源瓶颈跨框架兼容性限制Hugging Face 的解决方案&#xff1a;SafeTensors行业与社区的推动SafeTensors 的意义总结 背景 最近要找一些适合embedding的模型&#xff0c;在huggingface模型库上看到一些排名比较靠前的&#xff0c;准…...

iOS safari和android chrome开启网页调试与检查器的方法

手机开启远程调试教程&#xff08;适用于 Chrome / Safari&#xff09; 前端移动端调试指南&#xff5c;适用 iPhone 和 Android&#xff5c;WebDebugX 出品 本教程将详细介绍如何在 iPhone 和 Android 手机上开启网页检查器&#xff0c;配合 WebDebugX 实现远程调试。教程包含…...

c语言第一个小游戏:贪吃蛇小游戏03

我们为贪吃蛇的节点设置为一个结构体&#xff0c;构成贪吃蛇的身子的话我们使用链表&#xff0c;链表的每一个节点是一个结构体 显示贪吃蛇身子的一个节点 我们这边node就表示一个蛇的身体 就是一小节 输出结果如下 显示贪吃蛇完整身子 效果如下 代码实现 这个hasSnakeNode(…...

​​​​​​​大规模预训练范式(Large-scale Pre-training)

大规模预训练指在巨量无标注数据上&#xff0c;通过自监督学习训练大参数量的基础模型&#xff0c;使其具备通用的表征与推理能力。其重要作用如下&#xff1a; 一 跨任务泛化 单一模型可在微调后处理多种NLP&#xff08;自然语言处理&#xff09;、CV&#xff08;计算机视觉…...

基于Flink的用户画像 OLAP 实时数仓统计分析

1.基于Flink的用户画像 OLAP 实时数仓统计分析 数据源是来自业务系统的T日数据&#xff0c;利用kakfa进行同步 拼接多个事实表形成大宽表&#xff0c;优化多流Join方式&#xff0c;抽取主键和外键形成主外键前置层&#xff0c;抽取外键和其余内容形成融合层&#xff0c;将4次事…...

React Native踩坑实录:解决NativeBase Radio组件在Android上的兼容性问题

React Native踩坑实录&#xff1a;解决NativeBase Radio组件在Android上的兼容性问题 问题背景 在最近的React Native项目开发中&#xff0c;我们的应用在iOS设备上运行良好&#xff0c;但当部署到Android设备时&#xff0c;进入语言设置和隐私设置页面后应用崩溃。我们遇到了…...

iptables实现DDos

最近有客户要定制路由器的默认防火墙等级&#xff0c;然后涉及到了DDos规则&#xff0c;对比客户提供的规则发现我们现有的规则存在明显的错误&#xff0c;在此记录一下如何使用iptables防护DDoS攻击 直接贴一下规则 #开启TCP SYN Cookies 机制 sysctl -w net.ipv4.tcp_synco…...