c++学习之类的继承与派生

本文介绍C++中的类继承与派生概念,包括单继承与多继承的定义方式,不同继承方式(公有、保护、私有)的特点及如何通过派生类构造函数初始化基类成员等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

8.3 类的继承与派生

C++语法:定义派生类
class 派生类名 : 继承方式1 基类1, 继承方式2 基类2, ...... // 派生类声明部分
{
public :
新增公有成员
protected :
新增保护成员
private :
新增私有成员
} ;

各新增函数成员的完整定义 // 派生类实现部分
语法说明:
 定义派生类时,在派生类名的后面添加继承列表,在声明部分的大括号里声明新增成员,在实现部分编写各新增函
数成员的完整定义代码;
 继承列表指定派生类从哪些基类继承。派生类可以只从一个基类继承(单继承),也可以从多个基类继承(多继
承)。每个基类以“继承方式 基类名”的形式声明,多个基类之间用“,”隔开;
 派生类将继承基类中除构造函数、析构函数之外的所有数据成员和函数成员。基类的构造函数和析构函数不能被继
承,派生类需重新编写自己的构造函数、析构函数。
 继承后,派生类会对其基类成员按照继承方式进行再次封装。继承方式有3种:public(公有继承)、protected(保
护继承)和private(私有继承);
 public(公有继承):派生类对其基类成员不做任何封装,它们在派生类中的访问权限与原来在基类中的权限相同;
 private(私有继承):派生类对其基类成员做全封装,它们在派生类中的访问权限统统被改为private(私有权限),
不管它们原来在基类中的权限是什么。使用私有继承,实际上是派生类要将其基类成员全部隐藏起来;
 protected(保护继承):派生类对其基类成员做半封装。基类中的public成员被继承到派生类后,其访问权限被降
格成protected(保护权限)。基类中的protected、private成员被继承到派生类后,其访问权限保持不变;
 在类声明部分的大括号中声明新增的数据成员、函数成员,并指定各新增成员的访问权限。在类实现部分编写各新
增函数成员的完整定义代码。

同名覆盖:派生类中定义与基类成员重名的
新增成员,新增成员将覆盖基类成员。通过
成员名访问时,所访问到的将是新增成员,
这就是新增成员对基类成员的同名覆盖。同
名覆盖后,被覆盖的基类成员仍然存在,只
是被隐藏了。可以访问被覆盖的基类成员,
其访问形式是:基类名 :: 基类成员名

派生类对象的定义与访问

BorderCircle obj;
– 访问公有的基类成员
obj.Circle::Input( )(注,同名覆盖时访问方法)、obj.CRadius( )、obj.CArea( )、obj.CLen( )
– 访问公有的新增成员
obj.w、obj.InnerArea( )、obj.BorderArea( )、obj.Input( )

派生类对象的构造与析构
– 派生类的构造函数
派生类构造函数名( 形参列表 ) : 基类名1( 形参1 ), 基类名2( 形参2 ), ……
{
…… // 在函数体中初始化新增成员
}
– 派生类对象中各数据成员的初始化顺序是:先调用基类构造函数,
初始化基类成员;再执行派生类构造函数的函数体,初始化新增
成员
– 如果派生类继承了多个基类,那么各基类成员的初始化顺序由其
在派生类继承列表中的声明顺序决定,声明在前的基类成员先初
始化

派生类的析构函数
– 派生类对象中数据成员的析构顺序是:先执行派生类析构函
数的函数体,清理新增成员;再调用基类析构函数,清理基
类成员。简单地说,对象的析构顺序与构造顺序相反,即先
析构新增成员,再析构基类成员
• 组合派生类的构造与析构
– 从基类继承来的成员(基类成员),二是新增的对象成员,
三是新增的非对象成员
– 组合派生类的构造函数需依次初始化基类成员、新增对象成
员、新增非对象成员。其中,初始化基类成员和新增对象成
员需通过初始化列表,初始化新增的非对象成员则是在函数
体中直接赋值
– 组合派生类对象中各成员的析构顺序与其构造顺序相反,即
先析构新增的非对象成员,再析构新增对象成员,最后才析
构基类成员

类A1
类A2

class A1
{
public:
int a1;
A1( int x = 0 ) // 构造函数
{ a1 = x; }
} ;
class A2
{
public:
int a2;
A2( int x = 0 ) // 构造函数
{ a2 = x; }
} ;
类B1
类B2
class B1
{
public:
int b1;
B1( int x = 0 ) // 构造函数
{ b1 = x; }
} ;
class B2
{
public:
int b2;
B2( int x = 0 ) // 构造函数
{ b2 = x; }
} ;
组合派生类C
class C : public A1, public A2 // 继承基类A1、A2
 { public: 
B1 bObj1; // 类B1的对象成员
bObj1 B2 bObj2; // 类B2的对象成员bObj2
 int c; 
// 组合派生类的构造函数:初始化基类成员、新增对象成员、新增非对象成员 
C( int p1=0, int p2=0, int p3=0, int p4=0, int p5=0 ) : A1(p1), A2(p2), bObj1(p3), bObj2(p4) { c = p5; } } ;

这里写图片描述

抽象基类减少重复代码,通过继承基类的方法重用这些代码
重新定义C++语言已有运算符的运算规则,使同一运算符作用于不同类型数据时执行不同的运算,这就是运算符重载
–程序员可以为类重载运算符,实现类运算
–重载运算符使用函数的形式来重新定义运算符的运算规则
函数类型 operator 运算符( 形式参数 )
{ 函数体 }
–将运算符函数定义为类的函数成员
–定义为类外的一个友元函数

关系运算符“==”

bool Complex :: operator ==( Complex c )
{
return ( real == c.real && image == c.image ) ;
}
Complex c1(1, 3), c2(2, 4);
if (c1 == c2) // 比较c1、c2是否相等
// ...... 代码省略
基于数据挖掘的音乐推荐系统设计实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人运动设备中的六轴姿态传感器,它集成了三轴陀螺仪三轴加速度计。这款传感器能够实时监测并提供设备的角速度线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp``MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口函数声明。它定义了`MPU6050`,该包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式I2C地址,`getAcceleration()``getGyroscope()`则分别用于获取加速度角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()``getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准滤波,以消除噪声漂移。 I2C通信协议是MPU6050Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到似的库来驱动MPU6050。STM32通常具有更强大的处理能力更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程数据处理原理Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地传感器交互,获取并处理数据,实现各种创新应用。博客其他开源资源是学习解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值