【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!  

                                 

                                                                 给个三连再走嘛~      

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

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

相关文章

车规级半导体分类(汽车芯片介绍)

车规级半导体&#xff0c;也被称为“汽车芯片”&#xff0c;主要应用于车辆控制装置、车载监控系统和车载电子控制装置等领域。这些半导体器件主要分布在车体控制模块上&#xff0c;以及车载信息娱乐系统方面&#xff0c;包括动力传动综合控制系统、主动安全系统和高级辅助驾驶…

谷歌浏览器安装不上【搬代码】

winR 输入regedit 计算机\HKEY_CURRENT_USER\SOFTWARE\Google 然后重新安装谷歌

如何通过本地搭建wamp服务器并实现无公网IP远程访问

文章目录 前言1.Wamp服务器搭建1.1 Wamp下载和安装1.2 Wamp网页测试 2. Cpolar内网穿透的安装和注册2.1 本地网页发布2.2 Cpolar云端设置2.3 Cpolar本地设置 3. 公网访问测试4. 结语 前言 软件技术的发展日新月异&#xff0c;各种能方便我们生活、工作和娱乐的新软件层出不穷&…

编程练习(2)

一.选择题 第一题&#xff1a; 考察转义字符和strlen函数求解字符串长度 进一步在VS中可以智能看出哪些字符是转义字符&#xff1a; 因此本体答案选择B 第二题&#xff1a; 本体较为简单&#xff0c;宏定义了三个数N,M,NUM,N值为2,M值为3&#xff0c;因此NUM值为8&#xff0c;…

uniapp微信小程序区分正式版,开发版,体验版

小程序代码区分是正式版&#xff0c;开发版&#xff0c;还是体验版 通常正式和开发环境需要调用不同域名接口&#xff0c;发布时需要手动更换 或者有些东西不想在正式版显示&#xff0c;只在开发版体验版中显示&#xff0c;也需要去手动隐藏 官方没有明确给出判断环境的方法&a…

pytorch @操作符

今天发现一个操作符 import torch a torch.tensor([[1,2],[2,3],[5,6]]) b torch.tensor([[2,1],[8,5],[3,2]]) c a*b d a b.t() ## [3,2] [2,3] print(*,c) print(,d)结果如下 import torch# Define matrices A torch.randn(3, 4) B torch.randn(4, 5)# Matrix mult…

强化学习:用Python训练一个简单的机器人

一、介绍 强化学习&#xff08;RL&#xff09;是一个令人兴奋的研究领域&#xff0c;它使机器能够通过与环境的交互来学习。在这篇博客中&#xff0c;我们将深入到RL的世界&#xff0c;并探索如何使用Python训练一个简单的机器人。在本文结束时&#xff0c;您将对 RL 概念有基本…

多元最短路(Floyd)

是一个基于动态规划的全源最短路算法。它可以高效地求出图上任意两点之间的最短路 时间复杂度 O(n^3) 状态转移方程 f[i][j]min(f[i][j],f[i][k]f[k][j]) 核心代码 void floyd(){for(int k1;k<n;k)for(int i1;i<n;i)for(int j1;j<n;j)s[i][j]min(s[i][j],s[i][k…

ZooKeeper的应用场景(命名服务、分布式协调通知)

3 命名服务 命名服务(NameService)也是分布式系统中比较常见的一类场景&#xff0c;在《Java网络高级编程》一书中提到&#xff0c;命名服务是分布式系统最基本的公共服务之一。在分布式系统中&#xff0c;被命名的实体通常可以是集群中的机器、提供的服务地址或远程对象等一这…

7.1 Redis基础

1、Redis概述 Redis是开源的、高性能的key-value数据库&#xff0c;Redis缓存有以下三个特点&#xff1a; Redis支持数据的持久化&#xff0c;可以将内存中的数据保存在磁盘中&#xff0c;重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类型的数据&#x…

LangChain手记 Memory

整理并翻译自DeepLearning.AILangChain的官方课程&#xff1a;Memory&#xff08;源码可见&#xff09; Memory 使用open ai的API调用GPT都是单次调用&#xff0c;所以模型并不记得之前的对话&#xff0c;多轮对话的实现其实是将前面轮次的对话过程保留&#xff0c;在下次对话…

mysql主从复制搭建(一主一从)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言MySQL复制过程分为三部&#xff1a; 一、准备工作二、配置>主库Master三、配置>从库SlaveSlave_IO_Running: YesSlave_SQL_Running: Yes 四、测试至此&am…

代码随想录算法训练营第四十二天|LeetCode 121,122

目录 LeetCode 121.买卖股票的最佳时机 动态规划五步曲&#xff1a; 1.确定dp[i][j] 的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历方向 5.打印dp数组 LeetCode 122.买卖股票的最佳时间II 动态规划五步曲&#xff1a; 1.确定dp[i][j] 的含义 2.找出递推公式 3.初始化dp数组…

玩转单元测试之gtest

引言 程序开发的时候&#xff0c;往往需要编写一些测试样例来完成功能测试&#xff0c;以保证自己的代码在功能上符合预期&#xff0c;能考虑到一些异常边界问题等等。 gtest快速入门 1.引入gtest # 使用的是1.10版本&#xff0c;其他版本可根据需要选择 git clone -b v1.1…

【QT】 Word模板编辑、转PDF格式

很高兴在雪易的CSDN遇见你 ,给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享基于QT进行Word模板编辑以及Word转PDF的技术,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 目录 …

集成DTM实现跨语言分布式事务V1.0

集成DTM实现跨语言分布式事务V1.0 简介 DTM是一款开源的分布式事务管理器&#xff0c;解决跨数据库、跨服务、跨语言栈更新数据的一致性问题。 通俗一点说&#xff0c;DTM提供跨服务事务能力&#xff0c;一组服务要么全部成功&#xff0c;要么全部回滚&#xff0c;避免只更新…

《Go 语言第一课》课程学习笔记(一)

配好环境&#xff1a;选择一种最适合你的 Go 安装方法 选择 Go 版本 一般情况下&#xff0c;建议采用最新版本。因为 Go 团队发布的 Go 语言稳定版本的平均质量一直是很高的&#xff0c;少有影响使用的重大 bug。可以根据不同实际项目需要或开源社区的情况使用不同的版本。 有…

Redis-分布式锁!

分布式锁&#xff0c;顾名思义&#xff0c;分布式锁就是分布式场景下的锁&#xff0c;比如多台不同机器上的进程&#xff0c;去竞争同一项资源&#xff0c;就是分布式锁。 分布式锁特性 互斥性:锁的目的是获取资源的使用权&#xff0c;所以只让一个竞争者持有锁&#xff0c;这…

【学习心得】安装cuda/cudann和pytorch

一、查看驱动信息 # 进入CMD输入命令 nvidia-smi 也可以右下角图标打开NVIDIA 设置进行查看 二、下载安装CUDA 1、下载 下载地址 https://developer.nvidia.com/ 2、安装 推荐自定义安装。建议只勾选Cuda&#xff0c;只安装这一个就好&#xff0c;以免报错安装失败。 3、验证…