C++:继承与派生基础

引入:

由自然界的动物繁衍的规律(eg: 动物继承父类的一切属性,由父类派生并增加自己的新特征)我们引入C++语言在类的使用中描述此类问题。

为解决代码重复使用、提升效率,引入继承机制:允许保留原有类的特性的同时,根据需要将类进行扩充修改

1.1概念

1.   有一个类派生出另一个新的类时:

  1. 原始类称为:基类(父类,Base class);
  2. 派生出的新类:派生类(子类,Derived class)。

2.  子类(派生类)是继承于由父类(基类)所得,可进行扩充、修改,父类(基类)除构造函数、析构函数外一切成员函数、数据成员,自动成为子类(派生类)的成员。

  1. 扩充:在子类中增加新的数据成员、成员函数;
  2. 修改:重写由基类继承的成员;
  3. 子类所继承的成员函数、数据成员,即使子类在继承后什么都没有,依然可根据成员权限访问、使用父类的成员。

1.2继承与派生的关系:

派生类可再次作为基类派生出新的派生类

分为单继承和多重继承两种:

  1. 单继承:如果一个派生类只有一个直接的基类
  2. 多重继承:如果一个派生类的直接基类有两个或两个以上

2.1派生类的定义:

派生类定义格式:

class 新派生类名 :继承方式 基类类名 
{
    //新增派生类的数据成员、成员函数
    private:
        ...
    protected:
        ...
    public:
        ...
}

格式说明:

  1. 三种继承方式(区别其继承后派生类对成员的访问权限):
    1. public:公有继承使用最多
    2. protected:保护继承
    3. private:默认不写时,系统归为私有继承
  2. 派生类的成员包括:
    1. 吸收基类成员:派生类继承了基类的除了构造函数和析构函数以外的全部数据成员和函数成员。
    2. 新增成员:增添新的数据成员和函数成员,体现了派生类与基类的不同和个性,是派生类对基类的发展。
    3. 对基类成员进行改造,包含两层含义:一是对基类成员的访问控制方式进行改造;二是定义与基类同名的成员,即同名覆盖

引例:

class A
{
private:
	int m_a;
protected:
	int m_b;
public:
	int m_c;
};

class B:public A 
{
    //新增成员变量
    public:
    int d;
}

int main()
{
    cout <<"A的大小=" << sizeof(A) << 
          ",B的大小=" << sizeof(B) << endl;

    return 0;
}

"A的大小= 12" "B的大小= 16 "

B派生类继承基类A 的所有成员的基础上新增成员(int d )四个字节

派生类将基类所有的成员全部继承,与基类的访问权限、继承方式无关,仅区别于是否有权限访问。

2.2 继承方式和派生类的访问权限:

派生类的访问权限由两部分因素共同决定:继承方式、基类的成员权限

说明:

  1. 当原基类成员权限为private时,派生类均无法访问
  2. 继承方式与基类成员权限,缩小配置权限
  3. protected 和 private 两种继承方式在当前派生类无区别,在下一次派生后:该子类类内无法访问private继承,可以访问protected 继承。

1.公有继承(public)使用最多:

父类中的private私有无权在子类中访问,protected public 权限不变

父类:

class A
{
public:
    void show1()
    {
        cout << "A::show1(),公有方法" << endl;
    }
protected:
    void show2()
    {
        cout << "A::show2(),保护方法" << endl;
    }
private:
    void show3()
    {
        cout << "A::show3(),私有方法" << endl;
    }
public:
	int m_a = 0;
protected:
	int m_b = 1;
private:
	int m_c = 2;
};

class B :public A
{
public:
    void show()
    {
        show1();//可以,继承下来是public,,可以在类外访问
        show2();//可以,继承下来是protected,不可以在类外访问
        //show3();//不能访问
    
        cout << m_a << endl;//可以,继承下来是public,可以在类外访问
        cout << m_b << endl;//可以,继承下来是protected,不可以在类外访问
        //cout << m_c << endl;//不能访问
    }
};

int main()
{
    B bb;
    bb.show1();//public可以在类外访问
    //bb.show2();//错误,protected不能在类外访问

    bb.m_a = 100;//public可以在类外访问
    //bb.m_b = 200;//错误,protected不能在类外访问

    bb.show();//public可以在类外访问

    return 0;
}

2.保护继承(protected)

父类中私有成员在子类中无权访问,父类中protected、public 变成protected保护权限

class B :protected A
{
public:
    void show()
    {
        show1();//可以
        show2();//可以
        //show3();//不能访问
    
        cout << m_a << endl;//可以
        cout << m_b << endl;//可以
        //cout << m_c << endl;//不能访问
    }
};

int main()
{
    B bb;
    //bb.show1();//错误,protected不能在类外访问
    //bb.show2();//错误,protected不能在类外访问

    //bb.m_a = 100;错误,protected不能在类外访问
    //bb.m_b = 200;//错误,protected不能在类外访问

    bb.show();//public可以在类外访问

    return 0;
}

3.私有继承(private)

父类中私有成员在子类中无权访问,父类中protected 、public 全部变成私有private权限

class B :private A
{
public:
    void show()
    {
        show1();//可以
        show2();//可以
        //show3();//不能访问
    
        cout << m_a << endl;//可以
        cout << m_b << endl;//可以
        //cout << m_c << endl;//不能访问
    }
};

int main()
{
    B bb;
    //bb.show1();//错误,protected不能在类外访问
    //bb.show2();//错误,protected不能在类外访问

    //bb.m_a = 100;错误,protected不能在类外访问
    //bb.m_b = 200;//错误,protected不能在类外访问

    bb.show();//public可以在类外访问

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git快速掌握,通俗易懂

Git分布式版本控制工具 介绍 Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。Git是由Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Git可以帮助开发者们管理代码的版本&#xff0c;避免代码冲突&#…

ESP32学习(2)——点亮LED灯

1.前期准备 开发板原理图如下&#xff1a; 可见LED灯接在了GPIO2口 那么要如何编写代码控制GPIO口的电平高低呢&#xff1f; 我们可以参考micropython的官方文档Quick reference for the ESP32 — MicroPython latest documentation 可见&#xff0c;需要导入machine包 若要…

【教程】C++语言基础学习笔记(九)——指针

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【C语言基础学习】系列文章 第一章 《项目与程序结构》 第二章 《数据类型》 第三章 《运算符》 第四章 《流程控制》 第五章…

面向智算服务,构建可观测体系最佳实践

作者&#xff1a;蓟北 构建面向 AI、大数据、容器的可观测体系 &#xff08;一&#xff09;智算服务可观测概况 对于越来越火爆的人工智能领域来说&#xff0c;MLOps 是解决这一领域的系统工程&#xff0c;它结合了所有与机器学习相关的任务和流程&#xff0c;从数据管理、建…

【C语言】内存函数memcpy和memmove的功能与模拟实现

1.memcpy 功能&#xff1a;把source指向的前num个字节内容拷贝到destination指向的位置去&#xff0c;可以拷贝任意类型的数据。 注&#xff1a;1.memcpy并不关心\0&#xff0c;毕竟传的也不一定是字符串&#xff0c;因此拷贝过程中遇到\0也不会停下来。 2.num的单位是字节&a…

基于Echarts的可视化项目

整体的效果 概览区域 <!-- 概览区域模块制作 --><div class"panel overview"><div class"inner"><ul><li><h4>2190</h4><span><i class"icon-dot"></i>设备总数</span></…

Java 基于springboot+vue在线外卖点餐系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

深度学习的新进展:探索人工智能的未来

文章目录 &#x1f4d1;引言深度学习技术概述计算机视觉领域的深度应用自然语言处理的深度革命跨领域应用的深度拓展深度学习的挑战与未来展望结语 &#x1f4d1;引言 在科技日新月异的今天&#xff0c;深度学习作为人工智能领域的一颗璀璨明珠&#xff0c;正在引领着技术创新…

ElasticSearch分词器和相关性详解

目录 ES分词器详解 基本概念 分词发生时期 分词器的组成 切词器&#xff1a;Tokenizer 词项过滤器&#xff1a;Token Filter 停用词 同义词 字符过滤器&#xff1a;Character Filter HTML 标签过滤器&#xff1a;HTML Strip Character Filter 字符映射过滤器&#x…

linux系统zabbix监控配置电话告警

电话报警 睿象云官网操作zabbix-server主机操作睿象云操作zabbix-server的web页面操作 睿象云官网&#xff1a;https://www.aiops.com/ 睿象云官网操作 登录睿象云平台后点击智能告警平台 在集成栏选择监控工具选择zabbix 填写应用名称保存并获取key zabbix-server主机操…

php基础学习之文件包含

描述 在一个php脚本中&#xff0c;将另一个php文件包含进来&#xff0c;合作实现某种功能 这个描述看起来似乎和C/Java等语言的头文件/包有点类似&#xff0c;但本质是不一样的 打个比方&#xff1a; C/Java的头文件/包更像是一个工具箱&#xff0c;存放各种很完善的工具&#…

找不到目标和方向,怎么办?

现代社会里&#xff0c;许多人常见的症状&#xff0c;就是「空心病」。 什么是空心病呢&#xff1f;类似这样&#xff1a; 我知道要有目标&#xff0c;但我就是不知道想做什么&#xff0c;感觉对一切事物都提不起兴趣&#xff0c;没有动力&#xff0c;怎么办&#xff1f; 这个…

骑士遍历初级版

时间限制&#xff1a;1秒 内存限制&#xff1a;128M 题目描述 如图&#xff0c;从左下角A点出发&#xff0c;马只能向右走&#xff0c;根据马走日字的规则&#xff0c;究竟如何走才能到达右上角B点 输入描述 两个整数x、y&#xff0c;代表右上角B点的坐标&#xff0c…

AcWing 112. 雷达设备(区间贪心)

[题目概述] 假设海岸是一条无限长的直线&#xff0c;陆地位于海岸的一侧&#xff0c;海洋位于另外一侧。 每个小岛都位于海洋一侧的某个点上。 雷达装置均位于海岸线上&#xff0c;且雷达的监测范围为 d&#xff0c;当小岛与某雷达的距离不超过 d 时&#xff0c;该小岛可以被雷…

Excel练习:日历

Excel练习&#xff1a;日历 ‍ 题目&#xff1a;制作日历 ‍ ​​ 用rows和columns函数计算日期单元格偏移量 一个公式填充所有日期单元格 ​​ ‍

FT2232调试记录(2)

FT2232调试记录 &#xff08;1&#xff09;获取当前连接的FTDI设备通道个数:&#xff08;2&#xff09;获取当前连接的设备通道的信息:&#xff08;3&#xff09;配置SPI的通道:&#xff08;4&#xff09;如何设置GPIO:&#xff08;5&#xff09;DEMO测试&#xff1a; FT2232调…

Unity 工具之 UniWebView 内嵌网页/浏览器到应用中,并且根据UGUI大小放置(简单适配UGUI)

目录 Unity 工具之 UniWebView 内嵌网页/浏览器到应用中&#xff0c;并且根据UGUI大小放置&#xff08;简单适配UGUI&#xff09; 一、简单介绍 二、UniWebView 组件上的几个参数属性选项介绍 三、一些关键接口介绍 四、Transition 五、Memory Management&#xff08;内存…

OJ刷题:找出单身狗1,2【建议收藏点赞】

目录 1. 单身狗12. 单身狗2 1. 单身狗1 代码实现&#xff1a; #include <stdio.h>int main() {int arr[] { 1,2,3,2,1 };int sz sizeof(arr) / sizeof(arr[0]);int i 0;int tmp 0;for (i 0; i < sz; i){tmp ^ arr[i];}printf("%d\n", tmp);return 0; …

微信小程序介绍、账号申请、开发者工具目录结构详解及小程序配置

目录 一、微信小程序介绍 1.什么是小程序&#xff1f; 2.小程序可以干什么&#xff1f; 3.微信小程序特点 二、账号申请 1.账号注册 2.测试号申请 三、安装开发工具 四、开发小程序 五、目录结构 JSON 配置 小程序配置 app.json 工具配置 project.config.json 页…

PHP毕业设计图片分享网站76t17

图片分享网站主要是为了提高工作人员的工作效率和更方便快捷的满足用户&#xff0c;更好存储所有数据信息及快速方便的检索功能&#xff0c;对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑用户的可操作性&#xff0c;遵循开发的系统优化的原则&#xff0c;…