c++学习之继承

news2024/11/28 0:54:38

目录

一,为什么需要继承

二,继承的基本概念

 三,派生类的定义

四,继承中的析构预构造

1,子类中的构造与析构的顺序

2,子类调用成员对象,父类的有参构造

五,子类与父类的同名处理

1.子类和父类 同名成员数据

2.子类和父类 同名成员函数


一,为什么需要继承

目的:提高代码重用,提高i开发效率。例如我们已经拥有了制作某一零件的整套设备,以这套设别为基础之上,通过改造这个设备以实现其他种零件的制作,省去了从新研发等的时间。类比于c++语言中,就是通过实现继承该类并改造,实现其他功能。

二,继承的基本概念

c++最重要的特征是代码重用,通过继承机制可以利用已有的数据类型来定义新的数据类型,新的类不 仅拥有旧类的成员,还拥有新定义的成员。 一个B类继承于A类,或称从类A派生类B。这样的话,类A成 为基类(父类), 类B成为派生类(子类)。

派生类中的成员,包含两大部分: 一类是从基类继承过来 的,一类是自己增加的成员。 从基类继承过过来的表现其共性,而新增的成员体现了其个性。

如图所示:

例如给定一个基类,我们可理解为是一个父亲类,在继承父亲类的某些功能,定义的新类也就是派生类(这里可当作子类),子类除了继承以外的功能,还有自己的一些功能。

 

 三,派生类的定义

我们通常这样定义子类(派生类),在有基类的前提下,定义子类在类定义的基本方式下,还需在后添加:继承方式  基类名

class 父类{};
class 子类:继承方式 父类名
{
//新增子类数据
};

这里的继承方式就是所谓基类中的public,private ,protected中的类型的成员,一般这里我们是使用公共继承的。

如图以下的三种继承方式:

 继承方式决定他们可以继承过来成员在派生类中是什么类型的,故我们可以知道,任何父类都不能将私有类型数据通过继承给予子类。如下:

#include<iostream>
using namespace std;
//定义基类
class Base
{
private:
	int a;
protected:
	int b;
public:
	int c;
};
//定义派生类
class Son :public Base
{
public:
	void fun()
	{
		cout << b << c << endl;
		//cout<<a<<endl;不可访问
	}
};
int main()
{
	Son a;
   // cout <<a.b<< endl;//不可访问
	cout << a.c<< endl;
	a.fun();
	return 0;
}

很显然如果是公有继承过来,b还是保护型的,对于私有的直接是无法继承,所以这里的b是无法访问的。

四,继承中的析构预构造

1,子类中的构造与析构的顺序

对于派生类中的构造与析构的顺序看可用下图展示:

 

即构造时:先构造父类,再构造对象中的构造函数,最后才是子类的构造,而析构就是与之相反。

如下:

class Base
{
public:
	Base()
	{
		cout << "父类构造" << endl;
	}
	~Base()
	{
		cout << "父类析构" << endl;
	}
};
class member
{
public:
	member()
	{
		cout << "对象构造" << endl;
	}
	~member()
	{
		cout << "对象析构" << endl;
	}
};
class Son :public Base
{
public:
	member a;
	Son()
	{
		cout << "子类构造" << endl;
	}
	~Son()
	{
		cout << "子类析构" << endl;
	}

};
int main()
{
	Son p;
	return 0;
}

 我们可以看到构造与析构的顺序。

2,子类调用成员对象,父类的有参构造

子类实例化对象时会自动调用成员对象、父类的默认构造。

子类实例对象时必须使用初始化列表 调用成员对象、父类的有参构造。(无参构造就不需要)

初始化列表时:父类写类名称 成员对象用对象名。

class Base
{
public:
	Base()
	{
		cout << "父类构造" << endl;
	}
	Base(int a)
	{
		cout << "父类有参构造" << endl;
		x = a;
	}
	~Base()
	{
		cout << "父类析构" << endl;
	}
	int x;
};
class member
{
public:
	member()
	{
		cout << "对象构造" << endl;
	}
	member(int a)
	{
		cout << "对象有参构造" << endl;
		y = a;
	}
	~member()
	{
		cout << "对象析构" << endl;
	}
	int y;
};
class Son :public Base
{
public:
	member a;
	int c;
	Son()
	{
		cout << "子类构造" << endl;
	}
	
	Son(int a, int b, int c) :Base(a), a(b)//初始化列表,基类用基类名显式调用,而对象调用用对象名么人不是类名
	{
		this->c = c;
		cout << "Son有参构造" << endl;
	}
	~Son()
	{
		cout << "子类析构" << endl;
	}

};
int main()
{
	Son p(10,20,30);
	return 0;
}

 注意初始化列表中基类与成员的构造调用!!

五,子类与父类的同名处理

我们先给出最实用的方法:

同名成员最简单最安全的处理方式:加作用域

1.子类和父类 同名成员数据

子类默认优先访问子类的同名成员

必须加父作用域 访问父类的同名成员。

class Base
{
public:
	int a;
public:
	Base(int a)
	{
		this->a = a;
	}
};
class son :public Base
{
public:
	int a;
	son(int x, int y) :Base(x)
	{
		a = y;
	}
};
//这里同名,但优先是子类成员
int main()
{
	son a(10, 20);
	cout << a.a <<endl;//20
	//给a加上作用域
	cout << a.Base::a << endl;//10
}

2.子类和父类 同名成员函数

class Base
{
public:
	void fun()
	{
		cout << "调用基类中fun" << endl;
	}
	int a;
};
class son :public Base
{
public:
	void fun()
	{
		cout << "调用派生类中fun" << endl;
	}
	
};
//这里同名,但优先是子类成员
int main()
{
	son a;
	a.fun();
	a.Base::fun();
	return 0;
}

 

 

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

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

相关文章

防雪崩利器之Hystrix

Hystrix作为一个容错组件&#xff0c;本文从它的作用、熔断设计、工作流程和应用方面一一道来&#xff0c;帮助大家了解如何使用。 1、什么是灾难性雪崩效应 要讲Hystrix&#xff0c;我们就要讲一种场景&#xff0c;在微服务架构中&#xff0c;如果底层服务出现故障&#xff0…

Ubuntu搭建APM固件编译环境

文章目录 前言一、下载源码二、配置编译环境三、编译固件 前言 Ubuntu20.04 APM 4.2.3 参考链接&#xff1a; https://ardupilot.org/dev/docs/building-setup-linux.html 一、下载源码 git clone https://github.com/ArduPilot/ardupilot.git下载完之后 cd ardupilotgit s…

Lecture 18 Information Extraction

目录 Named Entity RecognitionRelation ExtractionOther IE TasksConclusion information extraction Given this: “Brasilia, the Brazilian capital, was founded in 1960.”Obtain this: capital(Brazil, Brasilia)founded(Brasilia, 1960) Main goal: turn text into str…

Linux基本指令详细介绍 【Linux】

文章目录 ls 指令( list directory contents)ls -als -alls -dlls -l (ll)ls -alF文件的类型 &#xff1a; pwd命令(Print Working Directory)cd 命令 &#xff08;change directory&#xff09;cd ..cd ~cd - touch指令mkdir指令mkdir -p ( parents) treermdir指令&#xff08…

【数据结构】哈希应用

目录 一、位图 1、位图概念 2、位图实现 2.1、位图结构 2.2、比特位置1 2.3、比特位置0 2.4、检测位图中比特位 3、位图例题 3.1、找到只出现一次的整数 3.2、找到两个文件交集 3.3、找到出现次数不超过2次的所有整数 二、布隆过滤器 1、布隆过滤器提出 2、布隆过…

javaScript蓝桥杯----商城管理系统

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 在商城管理系统中&#xff0c;超级管理员和普通管理员因为权限不同&#xff0c;登录进入后看到的菜单也会是不同的。 本题需要你完成商城管理系统中权限数据的处理。 二、准备 开始答题前&#xff0c;需要先打开本…

2023年,千万不要裸辞....

作为IT行业的大热岗位——软件测试&#xff0c;只要你付出了&#xff0c;就会有回报。说它作为IT热门岗位之一是完全不虚的。可能很多人回说软件测试是吃青春饭的&#xff0c;但放眼望去&#xff0c;哪个工作不是这样的呢&#xff1f;会有哪家公司愿意养一些闲人呢&#xff1f;…

硬件设计电源系列文章-LDO基础知识

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 例如&#xff1a; 本文主要开始讲述电源的发展 整体架构流程 提示&#xff1a;这里可以添加技术整体架构 AC/DC转换基础。为什么需要AC需要DC 技术名词解释 提示&#x…

车载测试很难吗?我靠着这套面试资料拿下了16k车载测试offer!

目录 如何写简历 项目经验 如何准备面试 车载项目的实施 常见面试题 总结&#xff1a; 车载测试通常包含以下三个方面&#xff1a; 系统测试&#xff1a;对整车系统进行测试&#xff0c;如车载电子系统、底盘系统、动力系统等。系统测试主要是评估整车各项性能指标是否达到…

STM32单片机(四)第一节:OLED调试工具

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

深入聊一下机械硬盘的相关内容

本文是《数据存储通识课》合集的一部分,本合集希望通过一系列文章科普数据存储相关技术内容。同时,本系列文章不仅仅是科普,还会进行有深度解析,理论结合实现,从代码实现层面进行剖析​ 介绍存储技术当然要从存储技术最基本的组件磁盘开始介绍了。目前市面上我们见得最多的…

shell脚本基础4——function函数、expect

文章目录 一、function函数1.1 函数的定义使用1.2 函数参数1.2.1 脚本内传参1.2.2 脚本外传参 1.3 引用局部变量1.3.1 区分局部变量1.3.2 全局变量在函数外1.3.3 全局变量在函数体1.3.4 函数体直接输出具体值 二、expect命令2.1 常用命令2.2 安装使用2.3 例一2.4 例二2.5 例三 …

Cmake工具的简单使用

引言 本篇文章讲述如何简单的使用cmake工具构建一个项目&#xff0c;帮助入门的c新手学会如何使用cmake. 我们在Clion新创建一个项目时&#xff0c;会发现&#xff0c;除了main.cpp文件之外&#xff0c;还存在一个build-debug目录和一个CMakelists.txt文件&#xff0c;如图: …

Spring Boot 集成 Redisson 实现分布式锁

Redisson 是一种基于 Redis 的 Java 驻留集群的分布式对象和服务库&#xff0c;可以为我们提供丰富的分布式锁和线程安全集合的实现。在 Spring Boot 应用程序中使用 Redisson 可以方便地实现分布式应用程序的某些方面&#xff0c;例如分布式锁、分布式集合、分布式事件发布和订…

Java学习记录

引入包 把jar包复制到lib下面&#xff0c;然后右键add as library 常用方法 读取文件&#xff1a;FileInputStream获得当前路径&#xff1a;System.getProperty(“user.dir”) 快捷键 https://blog.csdn.net/W_317/article/details/114300373 常用的 生成循环&#xff1…

VMware Workstation 16 安装教程

哈喽&#xff0c;大家好。今天一起学习的是VMware Workstation 16的安装&#xff0c;vm虚拟机是小编非常喜欢的生产力软件&#xff0c;小编之前发布的测试教程钧在vm上进行的实验。 VMware Workstation是一款功能强大的桌面虚拟计算机软件&#xff0c;它能够让用户在宿主机操作…

Coggle 30 Days of ML 打卡任务一:两个赛题数据可视化

Coggle 30 Days of ML 打卡任务一&#xff1a;两个赛题数据可视化 任务一&#xff1a;两个赛题数据可视化 难度/分值&#xff1a;低/1 打卡内容&#xff1a; 参赛选手名称&#xff1a;AppleDoctor完成日期&#xff1a;2023.6.6任务完成情况&#xff1a; 使用的编程语言&…

【你真的会斗图嘛?】Python爬虫实战项目——你想要的图都可以爬到(附安装地址)

目录 一、安装知识&#xff08;1&#xff09;Python环境变量&#xff08;2&#xff09;Pycharm开发工具&#xff08;3&#xff09;requests模块1、安装下载好Pycharm之后&#xff0c;找到终端进行下载requests模块2、输入下载语法&#xff1a;3、此次项目还需用到正则&#xff…

【STM32】制作一个bootloader

工作环境&#xff1a;STM32CubeMXKeil 相关环境准备这里就不介绍了。 bootloader是什么 bootloader就是单片机启动时候运行的一段小程序&#xff0c;这段程序负责单片机固件的更新&#xff0c;也就是单片机选择性的自己给自己下载程序。可以更新&#xff0c;可以不更新&…

C++课程设计:电梯控制系统程序设计

目录 电梯控制系统程序设计背景 类结构图 程序设计 程序释义 运行展示 总结与体会 电梯控制系统程序设计背景 电梯控制系统程序设计旨在通过C编程实现电梯的模拟功能&#xff0c;使用户能够选择上行或下行&#xff0c;并输入要进入的楼层&#xff0c;程序将模拟电梯运行过…