C++如何让自己变得富有?

news2025/2/28 12:57:10

在这里插入图片描述

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻强烈推荐优质专栏: 🍔🍟🌯C++的世界(持续更新中)
🐻推荐专栏1: 🍔🍟🌯C语言初阶
🐻推荐专栏2: 🍔🍟🌯C语言进阶
🔑个人信条: 🌵知行合一
🍉本篇简介:>:讲解C++中有关继承的概念.
金句分享:
✨那些看似不起波澜的日复一日会在某一天,让你看到坚持的意义!✨

前言

本篇只是介绍了C++中继承的一部分简单知识,继承的概念,继承的格式,继承方式等,
对于复杂的多继承,菱形继承,下一篇会介绍.

目录

  • 前言
  • 一、继承介绍:
  • 二、继承的格式:
  • 三、继承方式
  • 四、切片
  • 总结:

虽然我没有财富,但是,我爸有,他给我留下了巨大的财富,我如果不好好学习,就只能回去继承亿万家产了.
(讲个笑话,不要当真.)
在这里插入图片描述
C++中的继承是什么呢?

一、继承介绍:

C++中的继承是面向对象编程中的一个重要概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的公共数据和函数成员。子类可以使用父类的数据和函数,同时也可以添加自己的数据和函数,将父类的功能扩展为更具体和特定的功能,使代码更加模块化和易于维护。

C++中,通过在子类定义中使用关键字“public”、“private”和“protected”来实现对继承的访问控制。三种方式,具体介绍在下面讲解.

C++中的继承是面向对象编程的重要特性之一,它允许一个类继承另一个类的属性和方法。被继承的类称为基类或父类,继承的类称为派生类或子类。

在这里插入图片描述

二、继承的格式:

派生类 +: +继承方式+基类

在这里插入图片描述

继承的初步体验:

#include <iostream>
using namespace std;

class People//基类
{
public:
	People(string name="cjn",int age=20)
		:_name(name)
		,_age(age)
	{
		cout << "People()" << endl;
	}

	void who(){
		cout << _name << endl;
		cout << _age << endl;

	}
protected:
	string _name;
	int _age;
};

class Student:public People		//派生类1 继承People类
{
public:
	Student(int sno= 20216868)
		:_sno(sno)
	{
		cout << "Student()" << endl;
	}
	void test(){
		//可以访问基类的protect成员
		_name = "王五";
		_age = 66;
	}
protected:
	int _sno;
};

class Teacher:public People
{
public:
	Teacher(string course ="Chinese")
		:People("wang wu",18)		//显示调用了基类的构造函数
		,_course()
	{
		cout << "Teacher()" << endl;
	}
protected:
	string _course;
};


int main()
{
	People p1("zhang san",25);
	p1.who();
	cout << endl;

	Student s1(20216666);
	s1.who();					//虽然Student类中并没有who方法,但是,Studen类继承了People类,在People类中定义了who方法
	cout << endl;

	Teacher t1("Physics");
	t1.who();					//虽然Teacher类中并没有who方法,但是,Teacher类继承了People类,在People类中定义了who方法
	cout << endl;


	return 0;
}

运行结果:

People()
zhang san
25

People()
Student()
cjn
20

People()
Teacher()
wang wu
18

分析:
虽然两个派生类中并没有实现who方法,但是它们都继承了People类,所以,可以使用People的成员和方法.
那为啥,输出的结果不一样呢?
1)因为在创建People类时,已经传参初始化了,People p1("zhang san",25);.

2)在创建Student类时,并没有为People传参赋值,所以这里编译器会采用People类的默认构造.
在这里插入图片描述

3)Teacher类中,显示调用了基类的构造函数,People("wang wu",18)

三、继承方式

继承方式有三种:
(1) “public”(公有继承:表示父类的公共成员在子类中仍然是公共的,可以直接访问;
(2)“private”(私有继承):表示父类的私有成员在子类中无法直接访问,只能通过父类提供的函数访问;
(3)“protected”(保护继承):表示父类的保护成员在子类中可以直接访问。

同样,类中成员的访问限定符也有三种:
(1)public(公有成员变量).
(2)private(私有成员变量)
(3)protected(保护成员变量)

继承方式与限定符 基类与派生类权限一览表
在这里插入图片描述
千万不要去背表格中的内容,不仅难背,还容易忘记.

总结一下很好理解的:

private<protected<public

权限=min(在基类的访问限定符,继承方式)

例外:(private无论何种继承方式都是在派生类中不可见)
这里需要注意的是,虽然在派生类中不可见,但也是被继承下来了.
如何证明也被继承下来了?

class People
{
public:
	People(string name = "cjn", int age = 20, int num = 4)
		:_name(name), _age(age), _num(num)
	{
		cout << "People()" << endl;
	}
	void who()
	{
		cout << "People_who" << endl;
		cout << _name << endl << _age << endl << _num << endl;
	}
public:
	int _a = 3;

protected:
	string _name;
	int _age;
private:
	int _num;
};

class Student :public People
{
public:
	Student(int sno = 20216868)
		:People("王五",30,90),_sno(sno)
	{
		cout << "Student()" << endl;
	}
	void who()
	{
		cout << "Student_who" << endl << "_sno=" << _sno << endl;
		People::who();
	}
protected:
	int _sno;
};
int main()
{
	People p1;
	Student s1;

	p1.who();
	s1.who();
	return 0;
}

在这里插入图片描述

试着手动分别实现一下,采用publicprotectedprivate三种继承方式,观察它们在派生类外面的访问权限.

还是代码演示看的清楚:

#include <iostream>
using namespace std;

class People
{
public:
	People(string name = "cjn", int age = 20)
		:_name(name)
		, _age(age)
	{
		cout << "People()" << endl;
	}
public:
	int _a = 3;

protected:
	string _name;
	int _age;

private:
	int _num;
};

//class Student :public People				//公有继承
//class Student :protected People			//保护继承
class Student :private People				//私有继承
{
public:
	Student(int sno = 20216868)
		:_sno(sno)
	{
		cout << "Student()" << endl;
	}
	void test()
	{
		//在派生类中可以访问基类的public成员
		_a = 5;

		//在派生类中可以访问基类的protect成员
		_name = "王五";
		_age = 66;

		//不可在派生类中访问基类的私有成员,公有继承都不行,因为基类的私有成员,在派生类不可见
		//_num = 20;		//报错

		//访问派生类自己的成员当然是可以的.
		_sno = 20214321;
	}
protected:
	int _sno;
};

int main()
{
	People* p1 = new People;
	
	cout << endl;

	Student* s1 = new Student;
	s1->test();

	//s1->_a = 3;	//公有继承时, 派生类的指针在派生类外面也可以访问基类的public成员.
	cout << endl;

	return 0;
}

我们一般都使用公有继承,在公有继承下:
(1)如果我们想让成员在派生类中可以访问,在外面不可访问,此时就适合在基类中定义为protected成员.
(2)如果我们希望成员在派生类外面都可以被访问,则采用public成员.

四、切片

派生类是由继承基类后,加上自己的成员构成的,那我们只取派生类中基类的那部分,将其赋值给一个基类对象,这就类似于切割或者切片.

定义:
派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用。这里有个形象的说法叫切片或者切割。寓意把派生类中父类那部分切来赋值过去。
在这里插入图片描述

#include <iostream>
#include<string>
using namespace std;
class People
{
protected:
	string _name;
	int _age;
private:
	int _num;
};

class Student :public People
{
protected:
	string _course;
	int _sno;
};
int main()
{
	People p1;				//基类对象
	Student s1;				//派生类对象
	People* pp1 = &p1;		//基类指针
	Student* ps1 = &s1;		//派生类指针

	
	//子类对象可以赋值给父类对象 / 指针 / 引用
	p1 = s1;						//基类对象可以由子类切片赋值
	pp1 = &s1;						//基类指针可以指向派生类的对象中基类的那部分(切片)
	People& rp1 = s1;				//基类的引用也可以由派生类的初始化

	//派生类对象不可由基类来赋值
	//s1 = p1;						//报错

	//派生类指针与基类指针可以强转赋值,但是注意越界.
	ps1=(Student*)pp1 ;
	pp1 = (People*)ps1;
	return 0;
}

总结:

C++中的继承有以下特点:

子类可以继承父类的公有成员(public)和保护成员(protect),但不能直接访问父类的私有成员。

子类可以增加自己的新成员和方法。

强调一波
C++中的继承有三种方式:

公有继承:以public关键字继承父类,父类的公有成员和保护成员都可以在子类中访问。

保护继承:以protected关键字继承父类,父类的公有成员和保护成员都会变成子类的保护成员。

私有继承:以private关键字继承父类,父类的公有成员和保护成员都会变成子类的私有成员。

  1. 基类private成员在派生类中无论以什么方式继承都是不可见的。不可见是指不能访问,不代表没有被继承下来.

  2. 基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。(这个上面有例子介绍)

  3. (1) 关键字class,也就是默认的继承方式是private.
    (2)struct,C++中结构体也升级为了类,但是结构体的默认的继承方式是public,不过最好显示的写出继承方式,更容易让人理解.

  4. 在实际运用中几乎都是使用public继承,很少有protetced/private继承,因为继承本身就是为了得到基类的成员,公有继承更加合适.

下一篇会介绍,派生类中的默认成员函数,多继承,菱形继承等知识,请保持关注哦!
在这里插入图片描述

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

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

相关文章

多输入多输出 | MATLAB实现CNN-BiGRU-Attention卷积神经网络-双向门控循环单元结合SE注意力机制的多输入多输出预测

多输入多输出 | MATLAB实现CNN-BiGRU-Attention卷积神经网络-双向门控循环单元结合SE注意力机制的多输入多输出预测 目录 多输入多输出 | MATLAB实现CNN-BiGRU-Attention卷积神经网络-双向门控循环单元结合SE注意力机制的多输入多输出预测预测效果基本介绍程序设计往期精彩参考…

Newman基本使用

目录 简介 安装 使用 官网 运行 输出测试报告文件 htmlextra 使用 简介 Newman 是 Postman 推出的一个 nodejs 库&#xff0c;直接来说就是 Postman 的json文件可以在命令行执行的插件。   Newman 可以方便地运行和测试集合&#xff0c;并用之构造接口自动化测试和持续集成…

基于Java的宠物医院管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领…

mysql面试题47:MySQL中Innodb的事务实现原理

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Innodb的事务实现原理 InnoDB是MySQL中一种常用的存储引擎,它支持事务和行级锁等特性。以下是InnoDB事务实现的简要原理: 事务定义: 事务是指一…

【算法系列 | 10】深入解析查找算法之—线性查找

序言 心若有阳光&#xff0c;你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏&#xff0c;希望能帮助大家很好的了解算法。主要深入解析每个算法&#xff0c;从概念到示例。 我们一起努力&#xff0c;成为更好的自己&#xff01; 今天第10讲&#xff0c;讲…

上机实验二 设计单循环链表 西安石油大学数据结构

实验名称:设计单循环链表 (1&#xff09;实验目的:掌握线性表的链式存储结构;掌握单循环链表及其基本操作的实现。 (2&#xff09;主要内容:实现单循环链表的初始化、求数据元素个数、插入、删除、取数据元素等操作;用插入法建立带头结点的单循环链表;设计一个测试主函数验证…

Sprint framework Day07:注解结合 xml 配置

前言 Spring注解结合XML配置是指在Spring应用中&#xff0c;使用注解和XML配置的方式来进行Bean的定义、依赖注入和其他配置。这种方式可以充分利用Spring框架的注解和XML配置两种不同的配置方式的特点。 在Spring框架中&#xff0c;我们可以使用注解来定义Bean&#xff0c;如…

后端:推荐 2 个 .NET 操作的 Redis 客户端类库

目录 Redis特点 Redis场景 1. StackExchange.Redis 2. FreeRedis &#x1f680; 快速入门 &#x1f3a3; Master-Slave (读写分离) &#x1f4bb; Pipeline (管道)示例 &#x1f30c; Redis Cluster (集群) Redis &#xff0c;是一个高性能(NOSQL)的key-value数据库,Re…

【linux进程(四)】僵尸进程和孤儿进程概念进程优先级讲解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; 进程优先级 1. 前言2. 什么是…

快递查询神器:一键筛选超时快递的方法揭秘

快递服务的快速发展&#xff0c;为我们的生活带来了极大的方便。然而&#xff0c;由于各种原因&#xff0c;有时候我们会遇到快递超时的情况&#xff0c;这给我们的生活带来了一些困扰。但是&#xff0c;现在有了一款神奇的快递查询助手软件&#xff0c;能够一键筛选超时快递&a…

上传文件夹里面的文件后,按树结构的table表格展示

1. 先处理最简单的 原始数据大概是这样: let fileArr [{progress: 100,status: 成功,type: 通号,webkitRelativePath: "六捷数据2023-05-04 163909/G163/Abis口详细信息_(G163)(380BL3544-0)(14984173988)(2018-01-24 174431.0740—2018-01-24 180347.9070).xls"…

Node.js 正在逐渐被淘汰!Bun 1.0 正在改变 JavaScript 的游戏规则

在深入讨论之前&#xff0c;我们需要解释什么是 JavaScript 运行时以及为什么我们应该关心其速度。 想象一下&#xff0c;你用 JavaScript 写了一个故事&#xff0c;需要有人大声读出来。JavaScript 运行时就像是那个友好的叙述者&#xff0c;为你的故事赋予生命&#xff01;它…

vue实时显示当前年月日时分秒有时间单位的<script setup>写法

在Vue 3中&#xff0c;您可以使用<script setup>语法来编写实时显示当前年月日时分秒并显示时间单位的代码。以下是一个示例&#xff1a; <template> <div> 当前时间&#xff1a;{{ currentDateTime }} </div> </template><script setup>…

el-table 表格里面有tree 层级 进行勾选和反勾选

// 勾选全选反勾选等实现setChecked(data) {for (let i 0; i < data.length; i) {const node data[i];if (node.isCheck) {// 如果当前节点被勾选&#xff0c;将其子节点全部设置为选中状态if(node.children) {for (let j 0; j < node.children.length; j) {const chi…

十三、前端开发知识快速入门

目录 一、HTML概述和基本结构1.1 概述1.2 基本结构1.3 html文档类型1.4 html注释 二、HTML常用标签2.1 块标签2.2 行内标签2.3 字符实体2.4 图片标签2.5 链接标签2.6 列表标签2.7 表单2.8 表格 三、页面布局四、CSS样式4.1 基本语法和页面引用4.2 文本样式设置4.3 颜色表示法4.…

asp.net会议预约管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 会议预约管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语 言开发 asp.net 会议预约管理系统 二、…

ES _bulk 批量操作用法

es 的 bulk 操作&#xff0c;是用来批量发送请求&#xff0c;或者理解为批量操作的。 支持4种操作 bulk 支持多种操作&#xff0c;如下create、index、update、delete。 create 如果文档不存在就创建&#xff0c;但如果文档存在就返回错误index 如果文档不存在就创建&#x…

敏捷开发流程图Scrum

敏捷开发中的Scrum流程通常可以用一个简单的流程图来表示&#xff0c;以便更清晰地展示Scrum框架的各个阶段和活动。以下是一个常见的Scrum流程图示例&#xff1a; 转自&#xff1a;Leangoo.com 免费敏捷工具 这个流程图涵盖了Scrum框架的主要阶段和活动&#xff0c;其中包括&…

ABAP 采购组 条目 Z001 不存在T161内-请检查输入

背景&#xff1a;在ALV报表更改PR采购组 做法&#xff1a;ALV报表取出PR相关数据&#xff0c;直接将采购组列设置为可编辑&#xff0c;然后设置按钮更改逻辑。 操作&#xff1a;将采购组值更新&#xff08;从原来500改为600&#xff09;&#xff0c;然后点更改功能按钮&#xf…

VMware Horizon 8 运维系列(四)云桌面虚拟机被移除网卡

前言 最近发现有一台云桌面虚拟机经常网卡莫名其妙就被删除了,从而造成网络中断,客户端无法连接到该虚拟机桌面,经过分析判断可能是由于用户在使用u盘的时候,误删了虚拟网卡设备造成的。 问题描述: 故障现象:客户机无法访问云桌面虚拟机: 查看桌面池列表,发现该虚拟机…