c++(五)

news2024/11/18 16:50:01

c++(五)

  • 继承
    • 基类和派生类
    • 继承的格式
    • 继承的方式
      • 三种:public、private、protected
    • 继承的规则
      • 多层继承
      • 多重继承
  • 类与类的关系

继承

  • 一个新类从已有的类那里获得其已有特性(属性、行为),这种现象称为类的继承

基类和派生类

<1>从已有的类(父类/基类)产生一个新的子类,称为类的派生。
<2>派生类是基类的具体化,而基类则是派生类的抽象。

  • 当新的类是已经存在的类的一种特殊版本的时候,可以使用继承
  • 子类要继承父类的所有特性(属性和行为),但是构造函数、析构函数是不能被继承的,友元也不能被继承,因为它不是类的成员

继承的格式

class 类名: 访问限定符 基类名
{
;
}

继承的方式

三种:public、private、protected

三种:public、private、protected

<1>以public的方式继承
在这里插入图片描述
<2>以private方式继承
在这里插入图片描述
<3>以protected方式继承
在这里插入图片描述

总结:
<1>不管使用哪种方式继承,父类的private成员在子类内部外部都不可访问
<2>不管使用哪种方式继承,父类的protected成员在子类内部可以访问,子类外部不可访问
<3>只有采用public方式继承的时候,父类中是什么样子的访问限定符在子类中也是什么样的访问限定符
<4>在继承时,父类中的成员变量一般建议放在protected中
<5>继承的方式建议用public的方式去继承

子类构造函数的执行
在继承关系中,创建子类对象时,先执行父类的构造函数,再执行子类的构造函数
子类析构函数的执行
在继承关系中,当子类的生命周期结束的时候,先执行子类的析构函数,再执行父类的析构函数

继承的规则

<1>子类的构造函数只会对子类的对象进行空间的分配和初始化,父类中继承来的属性只能由父类的构造函数
进行初始化
<2>在子类创建对象的时候,若没有指定父类要执行的构造函数,父类就会执行它的默认构造函数

在这里插入图片描述

多层继承

A–>B–>C

如果不指定父类的构造函数,默认执行的是父类的默认构造函数

#include <iostream>
using namespace std;
/*
* 多重继承
*/
class People
{
public:
	People()
	{
		cout << "父类默认构造" << endl;
	}
	People(string name , int age = 18):name(name),age(age)
	{
		cout << "父类构造" << endl;
	}
	~People()
	{
		cout << "父类析构" << endl;
	}
	void show()
	{
		cout << "姓名:" << this->name << ","
			<< "年龄:" << this->age << endl;
	}
private:
protected:
	string name;
	int age;
};
class Stu : public People
{
public:
	Stu(int sno = 1, string name = "李四", int age = 18) :sno(sno)
	{
		cout << "子类构造函数" << endl;
	}
	~Stu()
	{
		cout << "子类析构" << endl;
	}
	//重定义
	void show()
	{
		cout << "学号:" << this->sno << ",姓名:" << this->name << ",年龄:" << this->age << endl;
	}
private:
protected:
	int sno;
};

int main()
{
	Stu stu1;
	stu1.show();
	return 0;
}

在这里插入图片描述
指定执行父类的构造函数

#include <iostream>
using namespace std;
/*
* 多重继承
*/
class People
{
public:
	People()
	{
		cout << "父类默认构造" << endl;
	}
	People(string name , int age = 18):name(name),age(age)
	{
		cout << "父类构造" << endl;
	}
	~People()
	{
		cout << "父类析构" << endl;
	}
	void show()
	{
		cout << "姓名:" << this->name << ","
			<< "年龄:" << this->age << endl;
	}
private:
protected:
	string name;
	int age;
};
class Stu : public People
{
public:
	Stu(int sno = 1, string name = "李四", int age = 18) :People(name, age),sno(sno)
	{
		cout << "子类构造函数" << endl;
	}
	~Stu()
	{
		cout << "子类析构" << endl;
	}
	//重定义
	void show()
	{
		cout << "学号:" << this->sno << ",姓名:" << this->name << ",年龄:" << this->age << endl;
	}
private:
protected:
	int sno;
};

int main()
{
	Stu stu1;
	stu1.show();

	Stu stu2(2, "王五", 22);
	stu2.People::show();
	stu2.show();

	return 0;
}

在这里插入图片描述

多重继承

在这里插入图片描述
**注意:**在多重继承关系中,先执行谁的构造函数与初始化的顺序无关,是由继承的先后顺序决定的
在这里插入图片描述
出现的问题:
在这里插入图片描述
解决:
<1>加上作用域(不合适)
在这里插入图片描述
<2>虚继承
在这里插入图片描述

#include <iostream>
using namespace std;
/*
* 多重继承
*/
class People
{
public:
	People()
	{
		cout << "people 默认构造" << endl;
	}
	People(string name, int age = 20) :name(name), age(age)
	{
		cout << "people类构造" << endl;
	}
	~People()
	{
		cout << "people 析构" << endl;
	}
	void show()
	{
		cout << "姓名:" << this->name << ",年龄:" << this->age << endl;
	}
private:
protected:
	string name;
	int age;
};
class Worker :virtual public People
{
public:
	Worker(string name, int age, int salary = 30000) :People(name, age), salary(salary)
	{
		cout << "worker构造" << endl;
	}
	~Worker()
	{
		cout << "worker析构" << endl;
	}
	void show()
	{
		cout << "姓名:" << this->name << ",年龄:" << this->age << ",薪资:" << this->salary << endl;
	}
private:
protected:
	int salary;
};
class Farmer : virtual public People
{
public:
	Farmer(string name, int age, int filecout = 200) :People(name, age), filecout(filecout)
	{
		cout << "farmer构造" << endl;
	}
	~Farmer()
	{
		cout << "farmer析构" << endl;
	}
	void show()
	{
		cout << "姓名:" << this->name << ",年龄:" << this->age << ",几亩田:" << this->filecout << endl;
	}
private:
protected:
	int filecout;
};
class workFarmer : public Worker, public Farmer
{
public:
	workFarmer(string name = "溜溜", int age = 22, int salary = 29830, int filecout = 200,int car = 3) :
		Worker(name, age, salary), Farmer(name, age, filecout),People(name,age),car(car)
	{
		cout << "workFarmer构造" << endl;
	}
	~workFarmer()
	{
		cout << "workFarmer析构" << endl;
	}
	void show()
	{
		cout << "姓名:" << this->name << ",年龄:" << this->age << ",几亩田:" << this->filecout 
			<<",薪资:" << this->salary << ",车辆:" << this->car << endl;
	}
private:
protected:
	int car;
};

int main()
{
	workFarmer wf1;
	wf1.show();
	wf1.Farmer::show();
	wf1.Worker::show();
	return 0;
}

在这里插入图片描述

类与类的关系

继承关系 is a的关系
编辑框类、按钮类、标签类 都称为组件类
编辑框、按钮、标签都是组件中的一种。
包含关系 has a的关系
登录类、注册类、
登录类中包含了编辑框类、按钮类、标签类的对象 ,这些标签、编辑框、按钮都是构成这些界面的组件!

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

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

相关文章

linux开发之设备树基本语法二

设备树特殊节点,对节点定义别名,chosen节点用来uboot给内核传参 上面的mmc0就是sdmmc0节点的别名 device_type属性 只对cpu节点和memory节点进行描述 自定义属性 这部分自定义,比如定义管脚标号,初始数值等 为什么我们可以在设备树上自己定义属性呢?设备树文件描述的是硬…

SQL数据分析常用函数

SQL 中有许多常用的函数&#xff0c;可以用于处理和操作数据。以下是一些常见的SQL 函数&#xff1a; 1. 字符串函数&#xff1a; CONCAT(str1, str2, …): 用于把多个文本字符串合并成一个长字符串(参数中有null时返回null)。 select concat(一起,学, SQL); -- 输出结果:一…

Golang | Leetcode Golang题解之第102题二叉树的层序遍历

题目&#xff1a; 题解&#xff1a; func levelOrder(root *TreeNode) [][]int {ret : [][]int{}if root nil {return ret}q : []*TreeNode{root}for i : 0; len(q) > 0; i {ret append(ret, []int{})p : []*TreeNode{}for j : 0; j < len(q); j {node : q[j]ret[i] …

P7-P9【分配器】【源文件】【OOPvs.GP】

分配器 如何分配&#xff0c;如何释放 源文件 标准库源代码文件VC布局 标准库源代码文件GCC布局 OOP(面向对象编程) VS GP(泛型编程) 这两种编程的区别&#xff1a; 面向对象编程是将数据和方法联系在一起&#xff0c;更注重对不同的对象做出不同的响应&#xff0c;更适合…

关于NLTK

一、NLTK简介 下图来自NLTK官网&#xff1a;https://www.nltk.org/index.html NLTK&#xff0c;全称为Natural Language Toolkit&#xff0c;是一个用于处理和分析自然语言文本的Python库。它提供了一系列丰富的工具和资源&#xff0c;包括词汇资源&#xff08;如WordNet&am…

电脑无法远程桌面连接,关于电脑无法建立远程桌面连接的问题分析与解决方案

在信息化快速发展的今天&#xff0c;远程桌面连接已成为许多企业和个人用户进行远程办公、技术支持以及数据管理的必备工具。然而&#xff0c;当电脑无法建立远程桌面连接时&#xff0c;可能会对用户的工作和日常生活造成极大的不便。本文将深入分析电脑无法远程桌面连接的原因…

探索超构光子学与人工智能相结合的下一代研究趋势

欢迎关注GZH《光场视觉》 一个研究小组在《固体与材料科学当前观点》&#xff08;Current Opinion in Solid State and Materials Science&#xff09;杂志上发表了一篇论文&#xff0c;强调了将超构 光子学研究与人工智能相结合的下一代研究趋势。超透镜引发了光学领域的一场…

Flink系列一:flink光速入门 (^_^)

引入 spark和flink的区别&#xff1a;在上一个spark专栏中我们了解了spark对数据的处理方式&#xff0c;在 Spark 生态体系中&#xff0c;对于批处理和流处理采用了不同的技术框架&#xff0c;批处理由 Spark-core,SparkSQL 实现&#xff0c;流处理由 Spark Streaming 实现&am…

LeetCode/NowCoder-链表经典算法OJ练习4

人的才华就如海绵的水&#xff0c;没有外力的挤压&#xff0c;它是绝对流不出来的。流出来后&#xff0c;海绵才能吸收新的源泉。&#x1f493;&#x1f493;&#x1f493; 目录 说在前面 题目一&#xff1a;环形链表 题目二&#xff1a;环形链表 II 题目三&#xff1a;随机…

json web token及JWT学习与探索

JSON Web Token&#xff08;缩写 JWT&#xff09;是目前最流行的跨域认证解决方案 作用&#xff1a; 主要是做鉴权用的登录之后存储用户信息 生成得token(令牌)如下 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNjg3Njc0NDkyLCJleHAiOjE2ODc3NjA4OTJ9.Y6eFG…

视创云展「VR直播」是什么?有哪些功能和应用场景?

视创云展「VR直播」通过“3D沉浸式展厅直播高互动感”的创新玩法&#xff0c;使企业随时随地举办一场低成本、高互动、能获客的元宇宙直播活动成为可能。「VR直播」能实现3D展厅内VR场景漫游&#xff0c;更结合音视频交互、同屏互动等新功能&#xff0c;为用户带来更沉浸的虚拟…

OpenStack创建云主机——超级详细步骤

四、创建云主机 一台云主机成功创建或启动需要依赖OpenStack中的各种虚拟资源&#xff0c;如CPU、内存、硬盘等。如果需要云主机丽娜姐外部网络&#xff0c;还需要网络、路由器等资源。如果需要外部网络访问云主机&#xff0c;那么还需要配置浮动IP。因此&#xff0c;在创建云主…

HiWoo Box工业网关

在科技飞速发展的今天&#xff0c;工业领域正迎来智能化变革。在这场变革中&#xff0c;工业网关作为连接工业设备与远程控制中心的桥梁&#xff0c;发挥着至关重要的作用。HiWoo Box网关凭借其卓越的性能和广泛的应用场景&#xff0c;为工业领域带来了全新的智慧化解决方案。 …

华为WLAN实验继续-2,多个AP如何部署

----------------------------------------如果添加新的AP&#xff0c;如何实现多AP的服务----------- 新增加一个AP2启动之后发现无法获得IP地址 在AP2上查看其MAC地址&#xff0c;并与将其加入到AC中去 打开AC&#xff0c;将AP2的MAC加入到AC中 sys Enter system view, re…

常见开源蜜罐系统

蜜罐系统&#xff08;Honeypot&#xff09;在信息安全领域中是一种被广泛使用的技术&#xff0c;旨在吸引和诱导黑客入侵&#xff0c;从而获取和分析攻击者的行为和手段。以下是一些常见的蜜罐系统的介绍&#xff1a; HFish开源蜜罐系统 特点&#xff1a; 多功能&#xff1a;支…

[数据集][目标检测]航空发动机缺陷检测数据集VOC+YOLO格式291张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;291 标注数量(xml文件个数)&#xff1a;291 标注数量(txt文件个数)&#xff1a;291 标注类别…

Java 使用WebMagic爬取网页(简单示例)

框架简介 WebMagic是一个基于Java的开源网络爬虫框架&#xff0c;它提供了很多简单易用的API接口&#xff0c;可以帮助使用者快速构建出高效、可扩展的网络爬虫程序&#xff0c;WebMagic由四个组件(Downloader、PageProcessor、Scheduler、Pipeline)构成&#xff0c;核心代码非…

Android制作.9图

需求背景&#xff1a;android 启动图变形 开发语言&#xff1a;uni-app&#xff0c;uni-app官网 俗语曰&#xff1a;授人以鱼不如授人以渔 原创地址&#xff1a;Android制作.9图 语雀 一.工具 使用android studio&#xff0c;因为android studio已经集成.9.png制作工具&a…

AI视频教程下载:零基础学会DALL-E 、Midjourney、Microsoft Designer、Adobe Firefly

学完本课程会得到什么&#xff1a; 掌握ChatGPT、DALL-E 2、Midjourney、Microsoft Bing Chat、Microsoft Designer和Adobe Firefly&#xff0c;全面理解生成性AI及其应用 了解OpenAI及其在生成性AI领域的尖端研究 理解提示工程的重要性以及它如何帮助产生更好的输出和数据 …

计算机二级Access操作题总结——基本操作

基础操作题 设置主键 例&#xff1a;将“线路”表中的“线路ID”字段设置为主键 ①右键单击“线路”表&#xff1b; ②单击【设计视图】&#xff1b; ③鼠标指到表的第一行→“线路ID”处&#xff0c;右键单击&#xff1b; ④单击【主键】 设置有效性规则 例&#xff1a;设…