C++三种继承方式 & is-a & has-a & 隐藏

本文介绍了C++中的三种继承方式:公有、保护和私有继承,以及is-a和has-a关系。公有继承维持成员的原有访问权限,而保护和私有继承会限制访问。同时,通过一个例子解释了成员隐藏的概念,即子类同名成员会隐藏父类的成员,需要特殊方式访问父类成员。

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

C++类中的成员(函数/变量)拥有三种访问权限:


public:表示公有成员,该成员不仅可以在类内可以被访问,在类外也是可以被访问的,是类对外提供的可访问接口;


private:表示私有成员,该成员仅在类内可以被访问,在类体外是隐藏状态;


protected:表示保护成员,保护成员在类体外同样是隐藏状态,但是对于该类的派生类来说,相当于公有成员,在派生类中可以被访问。

最常见的就是公有继承,它建立一种is-a的关系。 
如何理解is-a呢?即派生类对象也是一个基类对象,可以对基类对象执行的任何操作,也可以对派生类对象执行。

举个栗子:
有一个水果Fruit类,可以保存水果的重量和热量;
香蕉是一种水果,所以可以从Fruit类派生出Banana类;
Banana类继承了父类的所有数据成员,因此,Banana对象将包含表示香蕉重量和热量的成员;
此外,Banana类可以添加专门用于香蕉的成员。
但是,Banana类不能删除基类的Fruit的属性。
因此Banana is a kind of Fruit,即我们所说的is-a关系。

class Banana:public Fruit
{
};
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

那么has-a关系呢?<

CEEMDAN是一种信号分解方法,它可以将非线性和非平稳信号分解成若干个固有模态函数(IMF)的叠加。下面是CEEMDAN的Python实现代码: ```python import numpy as np from scipy.interpolate import UnivariateSpline def emd(x): x = x.astype(np.float64) t = np.arange(len(x)) imf = np.zeros((len(x), 2)) while True: if np.max(np.abs(x)) < 1e-10: break h = x sd = np.inf while sd > 0.1: spl = UnivariateSpline(t, h) h1 = h - spl(t) spl = UnivariateSpline(t, h1) h2 = h1 - spl(t) sd = np.sqrt(np.mean(h2 ** 2)) h = h1 - h2 imf[:, 0] += h imf[:, 1] += x - h x = imf[:, 1] return imf def ceemdan(x, n_imfs): x = x.astype(np.float64) imfs = np.zeros((len(x), n_imfs)) for i in range(n_imfs): imf = emd(x) imfs[:, i] = imf[:, 0] x -= imf[:, 0] imfs[:, -1] += x return imfs ``` 其中,`emd`函数实现了一次EMD分解,`ceemdan`函数实现了多次EMD分解,得到多个IMF。具体实现过程如下: 1. 首先将输入信号`x`转换为浮点数类型,并生成时间序列`t`。 2. 进入循环,如果信号的最大值小于1e-10,则跳出循环。 3. 将当前信号`x`赋值给变量`h`,并初始化标准差`sd`为正无穷。 4. 进入内层循环,使用样条插值方法拟合信号`h`,得到拟合曲线`spl(t)`。 5. 计算残差信号`h1=h-spl(t)`,再次使用样条插值方法拟合`h1`,得到拟合曲线`spl(t)`。 6. 计算残差信号`h2=h1-spl(t)`的标准差`sd`,如果`sd>0.1`,则将`h=h1-h2`,继续进行内层循环;否则跳出内层循环。 7. 将分解得到的IMF分别存储在二维数组`imf`的第一列中,将剩余信号存储在第二列中。 8. 将剩余信号作为新的输入信号,继续进行EMD分解,直到剩余信号的最大值小于1e-10或者达到最大迭代次数。 9. `ceemdan`函数调用多次`emd`函数,得到多个IMF,最后一个IMF加上剩余信号作为最后一个分量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值