【C++】一文了解继承

【C++】继承总结 本博客介绍了继承的概念、继承的规则、基类与派生类对象的赋值转换、继承的作用域、隐藏(重定义)、派生类的默认成员函数、继承与友元的关系、继承与静态成员、继承与组合、对多继承、菱形继承和菱形虚拟继承 阅读详情


在这里插入图片描述

前言

前面的文章我们已经学习了很多关于C++语法的知识,今天我们主要来介绍一下C++中关于继承的知识,有了继承,我们的C++程序可以更加简便的实现代码的复用。


一、继承的概念

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的复用,继承是类设计层次的复用。

二、继承的定义

2.1 定义格式

下面是一个Student类继承Person类的定义方式
在这里插入图片描述
在这里插入图片描述

2.2 继承基类成员访问方式的变化

在这里插入图片描述
1.基类private成员在派生类中无论以什么方式继承都是不可见的,这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。

  1. 基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。

  2. 基类的私有成员在派生类都是不可见。基类的其他成员在派生类的访问方式==Min(成员在基类的访问限定符,继承方式),public >protected>private。

  3. 使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public。

  4. 在实际运用中⼀般使用都是public继承,几乎很少使用protetced/private继承,也不提倡使用protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使面,实际中扩展维护性不强。

2.3 继承类模板

基类是类模板时,需要指定⼀下类域, 否则编译报错:error C3861: “push_back”: 找不到标识符
因为stack实例化时,也实例化vector了 但是模版是按需实例化,push_back等成员函数未实例化,所以找不到
代码如下(示例):

template<class T>
 class stack : public std::vector<T>
 {
 public:
 void push(const T& x)
 {
 vector<T>::push_back(x);
 //push_back(x);
 }
 void pop()
 {
 vector<T>::pop_back();
 }
 const T& top()
 {
 return vector<T>::back();
 }
 bool empty()
 {
 return vector<T>::empty();
 }
 };
}

2.4 基类和派生类间的转换

public继承的派生类对象可以赋值给基类的指针/基类的引用。这里有个形象的说法叫切片或者切割。寓意把派生类中基类那部分切出来,基类指针或引用指向的是派生类中切出来的基类那部分。

在这里插入图片描述

基类对象不能赋值给派生类对象。

基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。但是必须是基类的指针是指向派⽣类对象时才是安全的。

class Person
{
protected :
 	string _name; // 姓名 
 	string _sex; // 性别 
	int _age; // 年龄 
};
class Student : public Person
{
public :
 	int _No ; // 学号 
};
int main()
{
 	Student sobj ;
 	// 1.派⽣类对象可以赋值给基类的指针/引⽤ 
 	Person* pp = &sobj;
 	Person& rp = sobj;
 	// ⽣类对象可以赋值给基类的对象是通过调⽤后⾯会讲解的基类的拷⻉构造完成的 
 	Person pobj = sobj;
 	//2.基类对象不能赋值给派⽣类对象,这⾥会编译报错 
 	sobj = pobj;
 	return 0;
}

三.继承中的作用域

隐藏规则:

  1. 在继承体系中基类和派生类都有独立的作用域。
  2. 派生类和基类中有同名成员,派生类成员将屏蔽基类对同名成员的直接访问,这种情况叫隐藏。(在派生类成员函数中,可以使用基类::基类成员 显示访问)
  3. 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。
  4. 注意在实际中在继承体系里面最好不要定义同名的成员。

四.派生类的默认成员函数

4.1 4个常见默认成员函数

  1. 派生类的构造函数必须调用基类的构造函数初始化基类的那⼀部分成员。如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调⽤。
  2. 派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。
  3. 派生类的operator=必须要调用基类的operator=完成基类的复制。需要注意的是派生类的operator=隐藏了基类的operator=,所以显⽰调⽤基类的operator=,需要指定基类作⽤域
  4. 派⽣类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。因为这样才能保证派生类对象先清理派生类成员再清理基类成员的顺序。
  5. 派生类对象初始化先调用基类构造再调派生类构造。
  6. 派生类对象析构清理先调用派生类析构再调基类的析构。

在这里插入图片描述

4.2 实现一个不能被继承的类

方法1:基类的构造函数私有,派生类的构成必须调用基类的构造函数,但是基类的构成函数私有化以后,派生类看不见就不能调用了,那么派生类就无法实例化出对象。
方法2:C++11新增了⼀个final关键字,final修改基类,派生类就不能继承了。

五.继承和友元

友元关系不能继承,也就是说父类友元不能访问子类私有和保护成员 。

六.继承与静态成员

父类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有一个static成员实例。

七.多继承及其菱形继承问题

7.1 继承模型

单继承:⼀个派⽣类只有⼀个直接基类时称这个继承关系为单继承
在这里插入图片描述

多继承:⼀个派⽣类有两个或以上直接基类时称这个继承关系为多继承,多继承对象在内存中的模型是,先继承的基类在前⾯,后⾯继承的基类在后⾯,派⽣类成员在放到最后⾯。
在这里插入图片描述

菱形继承:菱形继承是多继承的⼀种特殊情况。菱形继承的问题,从下⾯的对象成员模型构造,可以看出菱形继承有数据冗余和⼆义性的问题。
在这里插入图片描述

虚继承

虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如图1所示。
类D继承自类B1、B2,而类B1、B2都继承自类A,因此出现如图1所示的局面(非虚基类)。
为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。最后形成如图1所示的情况。
在这里插入图片描述
代码如下

class A;
class B1:public virtual A;
class B2:public virtual A;
class D:public B1,public B2;

总结

以上就是今天要讲的内容,本文简单介绍了C++中继承的使用,希望这篇文章对你有帮助,期待你的一键三连。

Cpp_继承 一、继承的基本概念第一级抽象:从具体的对象抽象出共同的属性和行为。学生:姓名、年龄、学号、吃饭、睡觉、学习 教师:姓名、年龄、工资、吃饭、睡觉、授课 第二级抽象:将类型之间共性抽取出来形成超集,将类型之间的个性具体化的不同子集中。人类:姓名、年龄、吃饭、睡觉 - 超集体现共性 - 基类 | 派生 ^ 学生是人类的一部分:学号、学习 \ 子集 - 子类 V 阅读详情

相关推荐

CPP中的继承语法

CPP中的继承语法

BinaryWiker的博客 1102

一文带你了解C++三大特性,封装、继承、多态

C++ 是一种高级语言,本教程是专门为初学者打造的,帮助他们理解与 C++ 编程语言相关的基础到高级的概念。

我宣布个事的博客 1431

osg3.6.5---osgEarth3.2 实现数字地球的加载

目前我在网上找得比较多的是osgearth2.10及以下的版本及加载数字地球的方法,但是我使用的是osg3.6.5和osgEarth3.。但是3.x版本和2.x版本差别很大,主要区别在于2.x有7个主要库,而3.x版本只有osgEarth这一个库。所以,特别记录一下。后面我讲他集成到qt的窗体在上传更新新的代码。1.直接上源码pro文件和cpp文件。

枫影竹韵的博客 1009

C++继承与菱形继承(一文了解全部继承相关基础知识和面试点!)

目的减少重复代码冗余Class 子类(派生类) : 继承方式 父类(基类)

qq_51365682的博客 1257

基于 YOLO + SAM 的自动图像标注实战

摘要: 本文提出一种基于YOLO检测和SAM分割的自动化数据标注流水线方案,通过YOLO定位目标并生成检测框,再以检测框为提示驱动SAM完成精细分割,最终输出YOLO格式的标注文件。该方案将人工标注升级为半自动流程,显著提升标注效率,尤其适用于多类别、大规模图像的实例级标注需求。代码模块化设计支持模型灵活替换,并集成异常处理与进度可视化功能。虽依赖YOLO检测质量且对小目标存在局限,但作为工程落地方案,可有效降低私有数据集构建成本,适用于工业检测、遥感等场景的冷启动标注。

qq_64366203的博客 1148

MINI PCIE接口设计要点:

3.3Vaux(5pins):3.3V电源。PERST#信号通过外接复位电路,可实现模块复位。模块可以通过硬件方式或软件方式关闭射频通信(不包括 GNSS)。LED_WWAN#:(O)漏极开漏,低有效。:(I)低激活系统禁止射频信号(飞行模式),因此需加上拉。UIM_PWR (1 pin):(O)UIM的电源输出。SMB_DATA:SMBus2.0数据信号线。UIM_VPP:(O)A类设备的可变电源电压。SMB_CLK:SMBus2.0时钟信号线。UIM_RESET:(O)UIM的复位信号。

qq_40010777的博客 8245

一文读懂C++虚继承的内存模型

一文读懂C++虚继承的内存模型1、前言2、多继承存在的问题3、虚继承简介4、虚继承在标准库中的使用5、虚继承下派生类的内存布局解析6、总结 1、前言 C++虚继承的内存模型是一个经典的问题,其具体实现依赖于编译器,可能会出现较大差异,但原理和最终的目的是大体相同的。本文将对g++中虚继承的内存模型进行详细解析。 2、多继承存在的问题 C++的多继承是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。从概念上来讲这是非常简单的,但是多个基类的相互交织可能会带来错综复杂的设计问题,命名冲突

游戏行业资深搬砖人员 1万+

Ubuntu20.04实时内核补丁PREEMPT_RT编译与安装全流程解析

本文详细解析了在Ubuntu20.04系统上编译与安装实时内核补丁PREEMPT_RT的全流程。从内核与补丁版本匹配、编译环境准备,到内核配置、编译排错,再到最终安装、验证与进阶优化,提供了手把手的实战指南,旨在帮助机器人、工业控制等对实时性有苛刻要求的开发者构建低延迟、高确定性的Linux系统。

weixin_29213827的博客 187

【c++】cpp类的继承

c++类的继承

hutaotaotao的博客 2299

基于Simulink的强化学习(DQN)自主调节占空比

摘要:本文介绍了一种基于Simulink的强化学习(DQN)方法,用于Buck变换器的自主占空比调节。通过建立马尔可夫决策过程模型,设计了包含状态、动作和奖励函数的强化学习框架,并在Simulink中实现了Buck主电路、RL接口模块和DQN智能体的集成。实验表明,相比传统PID控制,DQN方法在负载突变和输入跌落等复合扰动下表现出更好的鲁棒性,电压超调小于1%,恢复时间缩短至0.3ms。文章还详细讨论了关键设计技巧、工程挑战及对策,并提出了多目标优化、先进算法应用等扩展方向,为智能电源控制提供了新思路。

amy_mhd的博客 75

从零开始利用树莓派+扬声器,实现简单的蓝牙音箱,手机连接放歌

树莓派4B自带蓝牙和Wifi, 无需外接 USB dongle;蓝牙最常见的应用是近距离传输数据,比如蓝牙传文件,蓝牙音箱等。正好家里有个普通的usb供电的便携音箱;本文用树莓派蓝牙+普通音箱,实现简单的蓝牙音箱。怎样理解这三层:可以类比Linux网络层:ALSA 类似网络驱动框架A2DP 类似TCP/UDP层PulseAudio 类似HTTP层的服务器,类比Apache而蓝牙连接类似http连接和会话;

南七小僧的学海无涯 2221

一文搞懂C++继承

C++继承太复杂,看这一篇文章就够了,核心内容大白话讲解。

qq_74319491的博客 1418

uniapp - 解决App端报错reportJSException >>>> exception function:createInstanceContext, exception:white sc

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果安卓app,uniApp报错,reportJSException>>>>exceptionfunction:createInstanceContext,exception:whitescreencausecreateinstanceContextfailed,运行自定义基座时白屏,uniapp项目运行白屏reportJSException,检查没问题依旧报错,第三方库插件,组件,uniapp打包调试

🏆 前端领域优质创作者 1万+

【C++】一文带你吃透C++继承

继承是C++语言的一个重要特性,继承使得软件(代码)复用变得简单、易行,可以通过继承复用已有的程序资源,缩短软件开发的周期。🍇1.1继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。继承&组合(也称合成): 是C++实现代码重用的2种主要方法。🍇。

qq_62662919的博客 2235

【Unity】【WebRTC】如何用Unity而不是浏览器接收远程画面

之前几篇我们讨论了如何设置信令服务器,如何发送画面给远端以及如何用浏览器查看同步画面,今天来讨论如何实现Unity内部接收画面。看本篇之前请先看过之前将web服务器设置和基本远程画面功能的几篇博文。在Unity编辑器中打开一个示例项目,点击BroadCast按钮。4. 再点击Receiver按钮,Start。Build一个示例项目,并运行这个项目。启动Web.app。

每日出拳老爷子的博客 1721

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C++类的继承(二)一文吃透继承

大家好,这里是小张,今天继续给大家带来**类的继承**,上一次我们说到了什么叫做继承,和继承的一些语法,今天就由小张来继续给大家讲解一下继承的三种方式,继承中的对象模型以及继承中的构造函数和析构函数的顺序,在此希望能够帮助到大家更好的理解类的继承。 首先我们先来看继承的三种方式,继承分为公共继承,保护继承以及私有继承,父类中的私有属性在子类中谁也访问不到,如果是公共继承,父类的公共属性在子类中仍是公共属性,父类的保护属性在子类依然是保护属性,私有还是私有,如果是保护继承,父......

weixin_64067830的博客 5万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C++继承(一文说懂)

详细介绍了c++继承的相关知识和使用,以及各种细节和继承的坑

You build it, you run it 2116

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【C++】第十五节—一文详解 | 继承

摘要:本文详细讲解了C++继承机制及其相关特性,包括继承概念、定义格式、访问方式变化、基类派生类转换、作用域规则、派生类成员函数实现等核心内容。重点分析了多继承带来的菱形继承问题及虚继承解决方案,并通过代码示例对比了继承与组合的设计差异。文章还探讨了继承与友元、静态成员的关系,以及如何实现不可继承的类等实用技巧。最后总结了继承与组合的选择原则,强调应根据实际需求合理使用这两种代码复用方式。全文内容系统全面,适合C++开发者深入学习面向对象编程中的继承机制。

稻草人 1万+

C++《继承》

在之前学习学习C++类和对象时我们就初步了解到了C++当中有三大特性,分别是封装、继承、多态,通过之前的学习我们已经了解了C++的封装特性,那么接下来我们将继续学习另外的两大特性,在此将分为两个章节来分别讲解继承和多态。本篇就先来学习继承的相关概念和性质,一起加油吧!

mljy.博客 2302

【C++】继承

Person是基类,也可以叫做父类。Student是派生类,也可以称为子类。

GGDxianv的博客 2230

【C++学习手札】一文带你认识C++虚继承​​

本文为作者对于虚继承学习的学习记录,也是对于上一篇博文关于虚函数的续写,希望对大家有所帮助(◕ᴗ◕)

B1ue还在专注 1816

C++——继承

在C++中,既然将之取名为继承,自然是因为与现实中的继承有某些相似的地方。 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,从而产生一个新的类,称之派生类。 继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。

花想云的博客 1518

继承(CPP)

继承(CPP)

2302_80190394的博客 1668

C++的诗行:一文读懂C++的继承机制

本文系统介绍了C++继承机制的核心概念与应用。主要内容包括:1)继承的基本概念与定义方式,通过public继承实现代码复用;2)派生类与基类间的转换规则(切片机制)及成员访问控制;3)隐藏机制与函数重载的区别;4)派生类中默认成员函数(构造/拷贝/赋值/析构)的实现要点;5)特殊关系处理:友元不可继承、静态成员共享;6)多继承中的指针偏移问题;7)菱形继承问题及虚继承解决方案;8)继承与组合的选择策略,强调优先使用低耦合的组合关系。文章通过代码示例详细说明了各类继承场景下的实现方法,为面向对象程序设计提供了

yue_2899799318的博客 1434

【C++进阶】深入了解继承机制

继承是面向对象编程中的一个重要概念,也是面向对象编程语言中普遍存在的特性,本文我将会深入的向大家介绍C++的继承以及继承中菱形继承的问题;继承的定义规则:前边我们在学习类的时候提到,类有三种访问限定符:它的继承方式也是这三种,继承方式不同,派生类使用基类时的权限也不同:继承基类成员访问方式的变化这张表我们可以分为两部分:基类的private成员为一类,它在派生类中不可见(不可见不代表没有继承下来),派生类无法使用(类里边和类外边都无法使用)

2202_75605090的博客 1152

深入了解C++中的继承

深入了解C++中的继承

CS_boy的博客 1020
上一篇: 【数据结构】一文了解计数排序
tidal_wave
博客等级 码龄3年 518粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值