C++类基础(十三)

news2024/11/13 9:25:02

类的继承
● 通过类的继承(派生)来引入“是一个”的关系( 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; //OK
    Base* 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(); //OK

    Derive d;
    d.funBase(); //OK
    d.funDerive(); //OK
    return 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(); //OK
    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;
    }
    //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 context
        std::cout << "Derive()\n";
    }
};
int main()
{
    Derive d(2);
    return 0;
}

在这里插入图片描述

参考
深蓝学院: C++基础与深度解析
17.2 — Basic inheritance in C++

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/343847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

StarRocks技术内幕 | 资源隔离原理解析

资源隔离一直是 StarRocks 用户讨论较多的话题&#xff0c;对于资源隔离的诉求&#xff0c;主要集中在四点&#xff1a;1. 很多用户关注资源的隔离性&#xff0c;期望当有核心业务的查询运行时&#xff0c;可以限制其他类型任务的使用资源&#xff0c;进而保障核心业务的响应时…

SpringMVC(1)

Web项目:基于HTTP协议&#xff0c;当一个用户从浏览器上面输入URL地址之后&#xff0c;URL能够和我们的程序映射起来&#xff0c;可以让用户的请求触达到后端程序里面&#xff0c;并且根据程序的处理&#xff0c;把结果返回浏览器&#xff1b; Spring MVC要进行学习的内容: 1)连…

三分钟学习 Gitee OpenAPI

文章目录1 什么是 Gitee Open API ?2 如何操作Open API ?2.1 申请私人令牌2.2 发起网络请求3 其他Git Open API3.1 Github Open API3.2 Gitlab OpenAPI1 什么是 Gitee Open API ? 简单说就是 网络请求 Open API 让我们可以通过网络请求的方式对 Git仓库的 分支&#xff0…

LinkedList与链表(数据结构系列5)

目录 前言&#xff1a; 1.链表的概念以及分类 1.1链表的概念 1.2分类 1.2.1单向和双向 1.2.2循环和非循环 1.2.3带头和不带头 2.无头单链表的模拟实现 3.双向链表的模拟实现 4.LinkedList的简单介绍 5.LinkedList的遍历 5.1直接打印 5.2for-each遍历 5.3迭代器遍历…

【Vercel】教你部署imsyy/home个人主页

本篇博客教你如何部署一个自己的个人主页 项目地址&#xff1a;https://github.com/imsyy/home 本文首发于 慕雪的寒舍 1.fork仓库vercel部署 首先我们点击fork&#xff0c;将仓库复刻到自己的账户 随后进入vercel&#xff0c;点击dashboard-add new-project 选择你复刻的仓库…

我的Android开发【分代收集算法】

为什么要采用分代收集算法&#xff1f; 分代的垃圾回收策略&#xff0c;是基于这样⼀个事实&#xff1a;不同的对象的⽣命周期是不⼀样的。因此&#xff0c;不同⽣命周期的对象可以采取不同的收集⽅式&#xff0c;以便提⾼回收效率。在 Java 程序运⾏的过程中&#xff0c;会产…

【大数据基础】vmware+ununtu安装详细过程

环境配置 1. 虚拟机VMware下载与安装 首先安装vmware workstation 密钥直接利用科技生成。 检查vmware是否成功安装 2. VMware安装Ubuntu18.04 LTS 在清华源镜像站找到合适版本的ubuntu 联网安装需要一些时间&#xff0c;大致在一到两个小…

NetSuite Balancing Segment平衡段

春节假期偷了一段时间懒&#xff0c;现在开始工作了。今朝谈一个偏门题目&#xff0c;于未知领域再下一城。说这个题目偏&#xff0c;就要讲讲渊源。话说在Oracle的EBS和Fusion产品中的COA领域有个功能叫做“Balancing Segment”。 问了几位Oracle老炮&#xff0c;也说是对第二…

RDS-MySQL算不算国产数据库及其风险问题

作者&#xff1a;IT圈黎俊杰 笔者在参与国内某大型央企信创替代研究工作中&#xff0c;遇到从各方面传来的“云平台上的RDS就是国产数据库&#xff0c;使用RDS替代原数据库&#xff0c;也是信创替代”的说法&#xff0c;当说的人多了&#xff0c;产生的误导性强了以后&#xff…

Qt OpenGL(三十八)——Qt OpenGL 核心模式-绘制彩色的点

提示:本系列文章的索引目录在下面文章的链接里(点击下面可以跳转查看): Qt OpenGL 核心模式版本文章目录 Qt OpenGL(三十八)——Qt OpenGL 核心模式-绘制彩色的点 一、场景 续接上一篇文章(动态刷新点云),动态刷新点云数据,如下图: 如果,我们需要的点的绘制是彩…

数据挖掘学习笔记——GEO数据库:芯片数据分析

数据挖掘 数据挖掘学习笔记——GEO数据库&#xff1a;芯片数据分析 文章目录数据挖掘一、芯片基础知识1.1、背景二、GEO数据库概述2.1、基础简介2.2、检索页面展示三、GSE项目的三种下载方式3.1、主页下载原始数据3.2、主页下载表达矩阵3.3、GEOquery包下载表达量四、基因名与…

AI与制造的联合与突破,捷配是作何选择的?

最近的chatGPT可谓是火遍全球&#xff0c;人工智能与AI的话题再一次被推上了各大平台热搜&#xff0c;各个行业、各路专家也大谈对各个行业的影响。那么PCB制造业中&#xff0c;AI意味着什么&#xff1f;某一天&#xff0c;在生产工厂中&#xff0c;看着每一条生产链条持续运行…

一文教你学会添加通达信外挂接口(财经外挂)

今天重点讲解怎样在您的股票交易软件里增加财经类外挂&#xff0c;对您的股票交易软件进行便利化的设置与完善&#xff0c;把您想看的内容统统加紧你的交易软件&#xff0c;方便以后的研究操作。 具体流程是这样的&#xff1a;打开您要添加的财经网站官网&#xff0c;复制官网…

第四章 模块和组件、模块化和组件化的理解

1、模块 理解&#xff1a;向外提供特定功能的js程序&#xff0c;一般就是一个js文件为什么要拆成模块&#xff1a;随着业务逻辑增加&#xff0c;代码越来越多且复杂作用&#xff1a;复用js&#xff0c;简化js的编写&#xff0c;提高js运行效率 我们以一段代码举例说明拆分模块…

C#WPF基础教程3——资源字典、样式、

资源字典 创建资源字典 创建合并资源属性 资源字典的使用 引用类库中的资源字典 在类库中创建资源字典 类库中资源字典的使用 样式 添加样式 使用静态的方式为按钮添加样式 设置背景样式&#xff0c;不能直接使用value 关联事件处理程序 UI层创建事件关联程序 model端创建…

每日学术速递2.13

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV、cs.AI、cs.CL 1.Deep Intra-Image Contrastive Learning for Weakly Supervised One-Step Person Search 标题&#xff1a;深度图像内对比学习用于弱监督的单步人物搜索 作者&#…

模型解释性:SHAP包的使用

本篇博客介绍另一种事后可解释性方法&#xff1a;SHAP(SHapley Additive exPlanation)方法。 1. Shapley值理论 Shapley值是博弈论中的一个概念&#xff0c;通过衡量联盟中各成员对联盟总目标的贡献程度&#xff0c;从而根据贡献程度来进行联盟成员的利益分配&#xff0c;避免…

机器学习-特征工程

特征工程是将原始数据转换为更好的代表预测模型的潜在问题的特征的过程&#xff0c;从而提高了对未知数据的预测准确性。特征抽取文本特征抽取&#xff0c;sklearn的API是sklearn.feature_extraction.text.CountVectorizer。&#xff08;1&#xff09;.英文分词from sklearn.fe…

Smart Finance 热启动创世开启,参与质押瓜分SMART资产

在2023年开年以来&#xff0c;加密市场开始迎来复苏&#xff0c;以BTC、ETH等为代表的主流加密资产迎来普涨&#xff0c;虽然相较于2021年顶峰时期相比仍存在一定的差距&#xff0c;但市场的回暖正在带动加密行业在2023年的复苏。而随着DigiDaigaku登录美国体育盛会“超级碗”&…

手把手教你抢BingChatGPT免费体验名额!

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;ChatGPT-Bing &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c;永…