【C++】一文带你初识C++继承

                                         

                                        食用指南:本文在有C基础的情况下食用更佳  

                                       🍀本文前置知识: C++类 

                                       ♈️今日夜电波:napori—Vaundy

                                                                1:21 ━━━━━━️💟──────── 3:23
                                                                    🔄   ◀️   ⏸   ▶️    ☰ 

                                      💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍 


目录

🍑一、继承和派生的概述

🍒 二、继承的语法

派生类定义格式:

继承方式分类:

基类个数分类:

派生类继承基类的规则 :

🍈三、继承中的构造函数和析构函数

构造和析构的顺序

  🍉子类中的构造(重要)

知识点1:

 知识点2:

🥝四、父类和子类的同名处理

成员变量的处理

 成员函数的处理


🍑一、继承和派生的概述

        在C++中,继承是一种对象-oriented编程(面向对象编程)的概念,它允许创建一个新的类(称为派生类)从一个现有的类(称为基类)继承属性和行为。通过继承,派生类可以获得基类的成员变量、成员函数和其他特性。

        继承有几种类型:公有继承、私有继承和受保护的继承。在公有继承中,基类的公有成员在派生类中仍然是公有的;在私有继承中,基类的公有成员在派生类中变为私有的;在受保护的继承中,基类的公有成员在派生类中变为受保护的。

        派生类可以通过继承来扩展基类的功能,它可以添加新的成员变量和成员函数,也可以重写基类的成员函数以改变其行为。派生类还可以访问基类的非私有成员。

        继承的优点:减少代码的冗余 提高代码的重用性

         一图让你认识继承和派生的概念~


🍒 二、继承的语法

派生类定义格式:

        注意以下两个格式都是一样的,定义以及意义都是相同的!


class 子类: 继承方式 父类名{

 //子类新增的数据成员和成员函数

 };


Class 派生类名 : 继承方式 基类名{

 //派生类新增的数据成员和成员函数

 };

继承方式分类:

        public : 公有继承 (重要)
        private : 私有继承
        protected : 保护继承

基类个数分类:


单继承:指每个派生类只直接继承了一个基类的特征 (一个父类 派生出 一个子类)
多继承:指多个基类派生出一个派生类的继承关系,多继承的派生类直接继承了不止一个基
类的特征(多个父类 派生出 一个子类)
 

注意:
        子类继承父类,子类拥有父类中全部成员变量和成员方法(除了构造和析构之外的成员方法),但是在子类中,继承的成员并不一定能直接访问,不同的继承方式会导致不同的访问权限。

派生类继承基类的规则 :

         一图让你理解~


🍈三、继承中的构造函数和析构函数

构造和析构的顺序

class Other
	 {
 public:
	 Other()
		 {
		 cout << "对象成员的构造函数" << endl;
		 }
	 ~Other()
		 {
		 cout << "对象成员的析构函数" << endl;
		 }
	 };
 class Base {
 public:
	 Base()
		 {
		 cout << "父类的无参构造函数" << endl;
		 }
	 ~Base()
		 {
		 cout << "父类中的析构函数" << endl;
		 }
	
};
 class Son :public Base
 {
 public:
	 Son()
		 {
		 cout << "子类的无参构造" << endl;
		 }
	 ~Son()
		 {
		 cout << "子类中的析构函数" << endl;
		 }
	
		 Other ob;//对象成员
	
		 };
 void test01()
 {
	 Son ob1;
  }

        运行结果如下:

         一图让你理解~

  🍉子类中的构造(重要)

        先看以下代码:

        父类

class Base
	 {
 private:
	 int a;
 public:
	Base()
	{
	 cout << "父类的无参构造函数" << endl;  
	}
	 Base(int a)
		 {
		 this-> a = a;
		 cout << "父类的有参构造函数" << endl;
		 }
	 ~Base()
		 {
		 cout << "父类中的析构函数" << endl;
		 }
	 };

知识点1:

        子类会默认调用 父类的 无参构造

        子类1:

 class Son :public Base
 {
 private:
	 int b;
 public:
	 Son()
	 {
		 cout << "子类的无参构造" << endl;
	 }
	 Son(int b)
	 {
		 this->b = b;
		 cout << "子类的有参构造函数int" << endl;
	 }

	 ~Son()
	 {
		 cout << "子类中的析构函数" << endl;
	 }
 };

 void test01()
 { 
	 Son ob1(10);
 }

        运行结果:

 知识点2:

        子类 必须显示 使用初始化列表 调用 父类的有参构造

         子类2:

 class Son :public Base
 {
 private:
	 int b;
 public:
	 Son()
		 {
		 cout << "子类的无参构造" << endl;
		 }
	 Son(int b)
		 {
		 this-> b = b;
		 cout << "子类的有参构造函数int" << endl;
		 }
	
		 //子类必须用 初始化列表 显示的调用父类的有参构造
		 //父类名称(参数)
		 Son(int a, int b) :Base(a)//显示的调用父类的有参构造
		 {
		 this-> b = b;
		 cout << "子类的有参构造函数 int int" << endl;
		 }
	 ~Son()
		 {
		 cout << "子类中的析构函数" << endl;
		 }
	 };


 void test01()
 { 
	//子类 默认 会调用 父类的无参构造
	//子类必须用 初始化列表 显示的调用父类的有参构造
	//父类名称+()
	Son ob2(10, 20);

 }

        运行结果:

 


🥝四、父类和子类的同名处理

成员变量的处理

        1、当 父类和子类 成员变量同名时 在子类就近原则 选择本作用域的子类成员
        2、如果在子类中 必须使用父类中的同名成员 必须加上父类的作用域。

         栗子:

class Base
	 {
	 //父类的私有数据 一旦涉及继承 在子类中不可见
 public:
	 int num;
 public:
	 Base(int num)
		 {
		 this-> num = num;
		 cout << "Base有参构造int" << endl;
		 }
	 ~Base()
		 {
		 cout << "析构函数" << endl;
		 }
	 };

 class Son :public Base
 {
 private:
	 int num;
 public:
	 Son(int num1, int num2) :Base(num1)
		 {
		 this-> num = num2;
		 cout << "有参构造int int" << endl;
		 }
	
		 ~Son()
		 {
		 cout << "析构函数" << endl;
		 }
	 void showNum(void)
		 {
		 //如果在子类中 必须使用父类中的同名成员 必须加上父类的作用域
			 cout << "父类中的num = " << Base::num << endl; 
			 //当 父类和子类 成员变量同名时 在子类就近原则 选择本作用域的子类成员
			 cout << "子类中的num = " << num << endl;
		 }
	 };

 void test01()
 {
	 Son ob1(10, 20);
	 ob1.showNum();
 }

        运行结果:

 成员函数的处理

        1、子类继承父类所有成员函数 和成员变量

        2、一旦子类 实现了 父类的同名成员函数 将屏蔽所有父类同名成员函数

          栗子: 

class Base
	 {
 public:
	 void func(void)
		 {
		 cout << "父类中的void func" << endl;
		 }
	 void func(int a)
		 {
		 cout << "父类中的int func a = " << a << endl;
		 }
	 };

 class Son :public Base
 {
  public:
	 //一旦子类 实现了 父类的同名成员函数 将屏蔽所有父类同名成员函数
		 void func(void)
		 {
		 cout << "子类中voidfunc" << endl;
		 }
	 };
 void test01()
 {
	 //为啥构造和析构除外?父类的构造和析构 只有父类自己知道该怎么做(构造和析构 系统自动调用)
	 //子类会继承父类所有成员函数(构造和析构函数除外) 和成员变量
	 Son ob1;
	 ob1.func();
	 //ob1.func(10);//err //一旦子类 实现了 父类的同名成员函数 将屏蔽所有父类同名成员函数
		
		 //如果用户 必须要调用父类 的同名成员函数 必须加作用域
	 ob1.Base::func();//调用父类的void func
	 ob1.Base::func(10);//调用父类的int func
 }

        运行结果:

         本文仅仅为对于C++中继承的基础知识,重要的还是在虚函数那一块,下一篇,我会详细的介绍虚函数!希望大家继续支持Thanks♪(・ω・)ノ


                感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o!  

                                 

                                                                 给个三连再走嘛~      

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

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

相关文章

数据库--SQL关键字的执行顺序

数据库相关链接&#xff1a; 数据库--数据类型&#xff1a;http://t.csdn.cn/RtqMD 数据库--三大范式、多表查询、函数sql&#xff1a;http://t.csdn.cn/udJSG 数据库--MySQL增删改查&#xff1a;http://t.csdn.cn/xkiti 一、一条sql语句通常包括&#xff1a; select fro…

[PaddlePaddle] [学习笔记] [上] 计算机视觉(卷积、卷积核、卷积计算、padding计算、BN、缩放、平移、Dropout)

1. 计算机视觉的发展历程 计算机视觉作为一门让机器学会如何去“看”的学科&#xff0c;具体的说&#xff0c;就是让机器去识别摄像机拍摄的图片或视频中的物体&#xff0c;检测出物体所在的位置&#xff0c;并对目标物体进行跟踪&#xff0c;从而理解并描述出图片或视频里的场…

pytest自动生成测试类 demo

一、 pytest自动生成测试类 demo # -*- coding:utf-8 -*- # Author: 喵酱 # time: 2023 - 08 -15 # File: test4.py # desc: import pytest import unittest# 动态生成测试类def create_test_class(class_name:str, test_cases:list) -> type:"""生成测试类…

根据源码,模拟实现 RabbitMQ - 通过 SQLite + MyBatis 设计数据库(2)

目录 一、数据库设计 1.1、数据库选择 1.2、环境配置 1.3、建库建表接口实现 1.4、封装数据库操作 1.5、针对 DataBaseManager 进行单元测试 一、数据库设计 1.1、数据库选择 MySQL 是我们最熟悉的数据库&#xff0c;但是这里我们选择使用 SQLite&#xff0c;原因如下&am…

JavaScript、TypeScript、ES5、ES6之间的联系和区别

ECMAScript&#xff1a; 一个由 ECMA International 进行标准化&#xff0c;TC39 委员会进行监督的语言。通常用于指代标准本身。JavaScript&#xff1a; ECMAScript 标准的各种实现的最常用称呼。这个术语并不局限于某个特定版本的 ECMAScript 规范&#xff0c;并且可能被用于…

看看安森美深力科NSI45090JDT4G 是如何点亮汽车内外照明系统解决方案

关于线性恒流调节器&#xff08;CCR&#xff09;&#xff1a;是一种用于控制电流的稳定输出。它通常由一个功率晶体管和一个参考电流源组成。CCR的工作原理是通过不断调节功率晶体管的导通时间来维持输出电流的恒定。当输出电流超过设定值时&#xff0c;CCR会减少功率晶体管的导…

Linux:shell脚本 正则表达式与AWK

一、正则表达式 由一类特殊字符及文本字符所编写的模式&#xff0c;其中有些字符&#xff08;元字符&#xff09;不表示字符字面意义&#xff0c;而表示控制或通配的功能&#xff0c;类似于增强版的通配符功能&#xff0c;但与通配符不同&#xff0c;通配符功能是用来处理文件…

八股文之框架篇(Spring Boot、SSM)

文章目录 Spring中的单例bean是线程安全的吗什么是AOP&#xff0c;项目中有没有使用到AOPSpring中的事务是如何实现的Spring中事务失效的场景有哪些Bean的生命周期Spring中的循环依赖&#xff08;循环引用&#xff09;SpringMVC的执行流程SpringBoot自动配置原理Spring、Spring…

生信豆芽菜-差异基因富集分析

网址&#xff1a;http://www.sxdyc.com/enrichmentEnrich 该工具使用R 语言的clusterProfiler包对关键基因集进行GO和KEGG富集分析&#xff0c;注意这个的关键基因集可以是差异基因&#xff0c;WGCNA的module基因&#xff0c;也可以是表型相关的基因集 1、数据准备 准备一个基因…

kubernetes企业级高可用部署

目录 1、Kubernetes高可用项目介绍 2、项目架构设计 2.1、项目主机信息 2.2、项目架构图 1、Kubernetes高可用项目介绍 2、项目架构设计 2.1、项目主机信息 2.2、项目架构图 2.3、项目实施思路 3、项目实施过程 3.1、系统初始化 3.2、配置部署keepalived服务 3.3、…

【Android Studio】 win11 安装配置 jdk17 超详细

概述 一个好的安装教程能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径&#xff0c;学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 一、下载JDK JDK官网 这里下载 JDK17 windows x64 installer 二、安装JDK 双击打开下载的 j…

如何在 iOS 上安装并使用 ONLYOFFICE 文档

借助 iOS 版文档应用&#xff0c;您可在移动端设备上访问存储于 ONLYOFFICE 账户中的文件&#xff0c;查看和编辑现有文本文档、电子表格和演示文稿&#xff0c;创建新文档并对其进行整理&#xff0c;以及连接第三方云存储服务。您可与其他门户网站用户协作编辑文档&#xff0c…

16.5.4 【Linux】SELinux 政策内的规则管理

SELinux 各个规则的布林值查询 getsebool 如果想要查询系统上面全部规则的启动与否 &#xff08;on/off&#xff0c;亦即布林值&#xff09;&#xff0c;很简单的通过 sestatus-b 或 getsebool -a 均可&#xff01; SELinux 各个规则规范的主体程序能够读取的文件 SELinux typ…

QT QtXlsx安装使用

QtXlsx介绍 QtXlsx是一个可以读取和写入Excel文件的库。它不需要Microsoft Excel&#xff0c;可以在Qt5支持的任何平台上使用。 这里一定是需要QT5支持的。 须知安装QtXlsx时&#xff0c;需要下载perl 1.安装perl 这里选择官网下载安装即可。 官网地址&#xff1a;https://p…

【Git】(四)子模块

1、增加子模块 进入准备添加子模块所在的目录&#xff0c;例如library。 git submodule add -b 1.0.0.0 gitgitee.com:sunriver2000/SubModule.git参数-b用于指定子模块分支。 2、更新子模块 git submodule update --progress --init --recursive --force --remote -- "…

Sending a Sequence Over the Network

一、题目 题面翻译 你现在有一个序列 a a a&#xff0c;定义一个用该序列生成新序列 b b b 的规则如下&#xff1a; 把 a a a 这个序列分成连续的几段&#xff1b;对于每一段&#xff0c;我们把这一段的长度插入到这一段的左边或右边。每一段进行操作后便得到了 b b b 序…

《零基础7天入门Arduino物联网-04》电路基础知识上

配套视频课程&#xff1a;《零基础学Arduino物联网&#xff0c;入门到进阶》 配套课件资料获取&#xff1a;微联实验室 配套学习套件购买&#xff1a;淘宝搜索店铺【微联实验室】 直流电与交流电 直流电&#xff08;DC&#xff09; 是指电流的方向始终保持不变的电流。这意味着…

什么是可视化编程?为什么它如此重要?

可视化编程&#xff0c;又叫可视化程序设计&#xff0c;一直以来就是备受讨论的“热门技术”。一方面&#xff0c;程序员抵触它&#xff0c;觉得它不如用代码开发。另一方面&#xff0c;对于产品经理等稍微懂点开发的业余人员&#xff0c;它确实能提供价值。所以&#xff0c;它…

LeetCode 1572. 矩阵对角线元素的和

【LetMeFly】1572.矩阵对角线元素的和 力扣题目链接&#xff1a;https://leetcode.cn/problems/matrix-diagonal-sum/ 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&…

数据可视化和数字孪生相互促进的关系

数据可视化和数字孪生是当今数字化时代中备受关注的两大领域&#xff0c;它们在不同层面和领域为我们提供了深入洞察和智能决策的机会&#xff0c;随着两种技术的不断融合发展&#xff0c;很多人会将他们联系在一起&#xff0c;本文就带大家浅谈一下二者之间相爱相杀的关系。 …
最新文章