C++继承与组合的区别

C++中继承与组合的区别详细解析 C++的“继承”特性可以提高程序的可复用性。正因为“继承”太有用、太容易用,才要防止乱用“继承” 立即下载

1、继承与组合

2、继承和组合的使用场景

3、继承和组合的区别

4、继承和组合的优缺点

  (1)继承的优缺点

  (2)组合的优缺点


1、继承与组合

    C++程序开发中,设计孤立的类比较容易,设计相互关联的类却比较难,这其中会涉及两个概念,一个是继承(Inheritance),一个是组合(Composition)。因为二者有一定的相似性,往往令程序员混淆不清。类的组合和继承一样,是软件重用的重要方式。组合和继承都是有效地利用已有类的资源。但二者的概念和用法不同。

    继承是面向对象三大基本特征之一(继承,封装,多态),继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。继承强调的是is-a关系。在继承中,父类的方法内部实现细节对子类可见,是‘白盒式’的代码复用。组合是通过对现有对象进行拼装即组合产生新的具有更复杂的功能,组合体现的是整体和部分,强调的是has-a的关系。   

2、继承和组合的使用场景

    如果类A和类B毫不相关,不可以为了使B 的功能更多些而让B 继承A 的功能。不要觉得“不吃白不吃”,让一个好端端的健壮青年无缘无故地吃人参补身体。如果类B需要使用A的功能,则要分两种情况考虑:

(1)若在逻辑上B 是A 的“一种”(a kind of ),则允许B 继承A 的功能。如男人(Man)是人(Human)的一种,男孩(Boy)是男人的一种。那么类Man 可以从类Human 派生,类Boy 可以从类Man 派生。示例程序如下:

class Human
{
  …
};
class Man : public Human
{
  …
};
class Boy : public Man
{
  …
};

(2)若在逻辑上A 是B 的“一部分”(a part of),则不允许B 继承A 的功能,而是要用A和其它东西组合出B。例如眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是头(Head)的一部分,所以类Head 应该由类Eye、Nose、Mouth、Ear 组合而成,不是派生而成。示例程序如下:

class Eye
{
public:
  void Look(void);
};
class Nose
{
public:
  void Smell(void);
};
class Mouth
{
public:
  void Eat(void);
};
class Ear
{
public:
  void Listen(void);
};
// 正确的设计,冗长的程序
class Head
{
public:
  void Look(void) { m_eye.Look(); }
  void Smell(void) { m_nose.Smell(); }
  void Eat(void) { m_mouth.Eat(); }
  void Listen(void) { m_ear.Listen(); }
private:
  Eye m_eye;
  Nose m_nose;
  Mouth m_mouth;
Ear m_ear;
};

    如果允许Head 从Eye、Nose、Mouth、Ear 派生而成,那么Head 将自动具有Look、Smell、Eat、Listen 这些功能:

// 错误的设计
class Head : public Eye, public Nose, public Mouth, public Ear
{
};

上述程序十分简短并且运行正确,但是这种设计却是错误的。这就开头所说的很多程序员经不起“继承”的诱惑而犯下设计错误。

3、继承和组合的区别

    继承与组合都是面向对象中代码复用的方式。在继承中,父类的内部细节对子类可见,其代码属于白盒式的复用,而组合中,对象之间的内部细节不可见,其代码属于黑盒式复用。继承在编码过程中就要指定具体的父类,其关系在编译期就确定,而组合的关系一般在运行时确定。继承强调的是is-a的关系,而组合强调的是has-a的关系。

4、继承和组合的优缺点

(1)继承的优缺点

  优点:

  •     支持扩展,通过继承父类实现,但会使系统结构较复杂
  •     易于修改被复用的代码

  缺点:

  •     代码白盒复用,父类的实现细节暴露给子类,破坏了封装性
  •     当父类的实现代码修改时,可能使得子类也不得不修改,增加维护难度。
  •     子类缺乏独立性,依赖于父类,耦合度较高
  •     不支持动态拓展,在编译期就决定了父类

(2)组合的优缺点

 优点:

  •     代码黑盒复用,被包括的对象内部实现细节对外不可见,封装性好。
  •     整体类与局部类之间松耦合,相互独立。
  •     支持扩展
  •     每个类只专注于一项任务
  •     支持动态扩展,可在运行时根据具体对象选择不同类型的组合对象(扩展性比继承好)

 缺点:

  •     创建整体类对象时,需要创建所有局部类对象。导致系统对象很多。

 参考:http://www.cnblogs.com/BeyondAnyTime/archive/2012/05/20/2510770.html

            https://blog.youkuaiyun.com/zymx14/article/details/79605926

【连接器专题】 EIA-364 系列标准的完整列表 EIA-364 系列标准在电子工业中具有重要的地位,为电子连接器和互连系统的测试和验证提供了统一的、可操作的流程和方法,有助于提高电子产品的质量和可靠性,促进了电子工业的发展 阅读详情

相关推荐

TSMaster实战:如何用LIN总线唤醒你的汽车电子系统(附波形分析)

本文通过TSMaster工具实战解析LIN总线唤醒机制。详细介绍了LIN网络唤醒的协议要求、时序参数计算,并演示了如何在TSMaster中配置唤醒信号、捕获分析波形,以及验证休眠流程。文章结合常见问题排查,为汽车电子工程师提供了从理论到实践的完整调试指南。

weixin_28308325的博客 460

什么是继承?什么是组合?为何说要多用组合少用继承?

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。/*** 动物System . out . println("呼气...吸气...");} } /*** 飞行动物* 继承,可以获得父类属性和方法System . out . println("飞行...");} }组合是通过对现有对象进行拼装即组合产生新的具有更复杂的功能。/*** 动物。

秃了也弱了 3963

RU.EXE实用指南:从基础操作到高级调试技巧

本文是RU.EXE(RW Everything)的实用指南,详细介绍了这款硬件调试工具从基础操作到高级技巧的全过程。文章阐述了RU.EXE作为直接读写硬件寄存器、内存和PCI配置空间的强大工具,如何帮助硬件工程师和开发人员高效进行底层系统调试与故障排查,并强调了安全操作的重要性。

weixin_29228203的博客 278

继承和组合

组合关系是一种强关联关系,被组合的类的对象的生命周期与组合类的对象的生命周期相互依赖。子类可以重写父类的方法,实现自己的行为,同时可以通过父类的引用或指针来访问子类对象,实现多态的效果。通过继承,子类可以获得父类的成员变量和成员函数,并且可以添加自己特定的成员变量和成员函数,以扩展父类的功能或实现自己的特定需求。需要注意的是,组合关系中,被组合的类的对象是作为成员变量直接存在于组合类中的,它们共享同一个命名空间,可以直接访问和使用。继承关系中,子类继承父类的属性和方法,子类可以重写父类的方法,实现多态性。

weixin_42492218的博客 1431

从零构建高精度电子秤:HX711与STM32的时序通信陷阱与实战避坑指南

本文详细解析了使用STM32F103C8T6与HX711模块构建高精度电子秤的通信时序陷阱与实战解决方案。重点探讨了微秒级延迟实现、数据读取算法、校准方法和滤波优化,帮助开发者避开常见通信问题,提升电子秤的测量精度和稳定性。

data3的博客 782

一文告诉你:如何在trae中编译运行STM32程序,并让AI帮你修改代码

本文详细介绍了如何将STM32程序从Keil迁移到国产免费工具Trae,并利用AI进行代码修改的全过程。

水滴爬呀爬 4886

高效学 C++|继承与组合

继承是面向对象程序设计的重要特性之一。作为面向对象的编程语言,C++语言也自然支持这个特性。继承是代码复用的基本方法之一,也是接口和复用设计的关键。本文介绍继承的含义和继承与组合的关系。

不断学习,不断进步,提高自己 1744

Open3D 点云转深度图像【2026最新版】

python版本Open3D 实现的点云转深度图像,博客长期更新,本文最新更新时间为:2026年5月10日。

点云侠的博客 2838

C++ 继承与组合的区别

C++ 程序开发中,设计孤立的类比较容易,设计相互关联的类却比较难,这其中会涉及两个概念,一个是继承(Inheritance),一个是组合(Composition)。因为二者有一定的相似性,往往令程序员混淆不清。类的组合和继承一样,是软件重用的重要方式。组合和继承都是有效地利用已有类的资源。但二者的概念和用法不同。

Doublelv 的博客专栏。 7140

【安全设备篇】HVV面试专题

还有就是这个可能是被访问的这个内网系统,本身业务系统存在业务逻辑问题,因为内网所布置的很多业务系统往往不会考虑一些安全性问题,比如在正常的业务逻辑请求中直接带了sql语句,就会触发设备规则产生告警,这一类是属于误报,然后会将此告警上报给研判人员,需要研判组专家和甲方客户确认下是否是该系统存在此业务逻辑问题,并且需要确认告警的源ip在此告警的时间段附近有没有进行操作过。天眼日志分析主要基于系统和应用程序的日志数据来识别安全威胁,而威胁感知则通过收集和分析多种来源的情报信息。理解威胁的性质和威胁背后的原理。

大河之犬的博客 7924

nvidia jetson orin调试 MAX96712 serdes相机(SG2-AR0233C-GMSL2)

背景:想了解一下关于nvidia orin camera相关的模块,基于Drive Orin demo板的话,没有合适的相机,用 nvsipl框架点亮 GMSL相机不知如何下手,那么基于nvidia Jetson orin的话,目前国内有对应的转接板以及GMSL相机可以参考,基于此,那么本文详细记录一下关于nvidia orin的相关踩坑记录;需要Nvidia Jetson Orin开发板一个,MIPI转接板一个,MIPI转GMSL转接板一个,GMSL线束(fakra单线束),GMSL摄像头一个。

qq_30025621的博客 4446

C++:组合和继承的区别

理解什么是组合,一个class类里面有很多其他class类类型的成员变量理解组合和继承的区别二义性:执行了一个函数,确不一定是自己想指定的那个解决方案:用c.A::func()明确的指定调用的是class虚继承有点像条件编译,引入一次就好,不用重复引入,也能达到引入效果学习记录,侵权联系删除。来源:朱老师物联网大课堂。

qq_43441284的博客 926

【CC精品教程】iTwin capture倾斜摄影建模完整操作流程

【CC精品教程】iTwin capture倾斜摄影建模完整操作流程。包括:无人机航测外业作业流程(像控点布设、航线规划、仿地飞行、航拍)和内业数据处理软件(Pix4d、CC、EPS、PhotoScan、Globalmapper)像控点权重调配、空三加密、DOM、DSM、DEM,DLG生成、等高线生成、高程点提取,点云分类过滤分割、点云生成DEM、三维模型生成等。

智慧空间实验室 3959

类的组合和继承的区别_C++日志(三十六)组合和继承的联系与区别

在C++中,组合和继承是两种常见的“代码复用”的方式,那么它们有什么联系和区别呢?1、联系: 根据前面的日志可知,二者都是通过已有类构造新类的过程。一个类将另一个类的对象作为其成员称为组合;一个类将另一个类作为其父类称为继承。2、区别:(1)从性质上看: 组合为“has-a”关系,即整体和部分的关系。比如类X作为类Y的成员,则X是部分,Y是整体。 继承为“is-...

weixin_34320235的博客 788

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

c++继承与组合的区别

转自:http://www.cnblogs.com/xiaozz/p/6448250.html C++程序开发中,设计孤立的类比较容易,设计相互关联的类却比较难,这其中会涉及到两个概念,一个是继承(Inheritance),一个是组合(Composition)。因为二者有一定的相似性,往往令程序员混淆不清。类的组合和继承一样,是软件重用的重要方式。组合和继承都是有效地利用已有类的资源。但二者的概...

Lawrence_121 1187

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C++中继承与组合的区别

C++程序开发中,设计孤立的类比较容易,设计相互关联的类却比较难,这其中会涉及到两个概念,一个是继承(Inheritance),一个是组合(Composition)。因为二者有一定的相似性,往往令程序员混淆不清。类的组合和继承一样,是软件重用的重要方式。组合和继承都是有效地利用已有类的资源。但二者的概念和用法不同。 如果类B 有必要使用A 的功能,则要分两种情况考虑: 1.继承 若在逻辑上B 是一种A (is a kind of),则允许B 继承A 的功能,它们之间就是Is-A 关系。如男人(Man)

奔涌的后浪的专栏 1052

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++中的继承和组合区别使用

为什么80%的码农都做不了架构师?>>> ...

weixin_33928467的博客 126

C++ 中继承和组合的区别

应试回答:继承是is-a的关系,组合是has-a的关系 1.继承 继承是面向对象三大基本特征之一(继承,封装,多态),继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。 直接通过例子来了解继承: /* * 动物 */ class Animal{ public: virtual void show()=0; } /** * 飞行动物 * 继承 */ class FlyingAnimals : public Anim.

weixin_42636062的博客 335

【C++】继承和组合的区别

1.什么是继承 A继承B,说明A是B的一种,并且B的所有行为对A都有意义 eg:A=WOMAN B=HUMAN A=鸵鸟 B=鸟 (不行),因为鸟会飞,但是鸵鸟不会。 2.什么是组合 若在逻辑上A是B的“一部分”(a part of),则不允许B从A派生,而是要用A和其它东西组合出B。 例如眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是头(Head)的一部分,所以类He...

如风逝去 870

c++继承和组合的区别

类的组合和继承一样,是软件重用的重要方式。组合和继承都是有效地利用已有类的资源。但二者的概念和用法不同。通过继承建立了派生类与基类的关系,它是一种 “是(is a)”的关系,如“白猫是猫”,“黑人是人”,派生类是基类的具体化实现,是基类中的一 种。通过组合建立了成员类与组合类(或称复合类)的关系,换句话说就是"有(has a)的关系".在功能上来看,它们都是实现系统功能重用,代码复用的最常用的有效

caoyan_12727的博客 5606

C++中类的继承和类的组合的区别

首先先看一组概念: 类的组合:一个类内嵌入其他类的对象作为数据成员,称为类的组合。 类的继承:在已有类的基础上创建新的类。新类可以从一个或多个已有类中继承成员函数或数据成员,而且新类还可以重新定义或添加新的数据和函数。 从以上的概念区别中可以看出,类的继承范围更广,它体现了多个类之间的关系。类与类之间的关系可以分为以下两种: 1.从属关系。 如果一个派生类是基类的某种特殊个体,则称两种类拥有从属关系,例如:学生是人,老师也是人,就可以用人的基类派生出学生、老师等派生类。 2.包含关系。 如果一个派生类中包含

米糊的头发箱(码代码掉的头发都在这里了) 1685

C++继承和组合的区别

类继承和对象组合是复用的两种最常用的技术。 一:继承   继承是Is a 的关系,比如说Student继承Person,则说明Student is a Person。继承的优点是子类可以重写父类的方法来方便地实现对父类的扩展。   继承的缺点有以下几点:   ①:父类的内部细节对子类是可见的。   ②:子类从父类继承的方法在编译时就确定下来了,所以无法在运行期间改变从父类继承的方法的行为...

菜鸟驿站 1030

c++中继承,关联,组合,聚合以及依赖的区别以及UML表示

目录 继承 (1)普通继承关系 (2)抽象继承关系 关联 (1)单向关联关系 (2)双向关联关系 (3)自关联关系 聚合 组合 依赖 继承 继承也叫作泛化关系,用于描述父子之间的关系,父类又称为基类或者超类,子类又称作派生类,在uml中,泛化关系用空心三角形的实线来表示 (1)普通继承关系 假如定义了一个person,student 以及teacher类 class Persion { public: string getName() { .

weixin_43632918的博客 2487

C++ - 继承 一些 细节 - 组合 和 继承的区别

本篇博客基于 之上列出一些例子,如果有需要请看以上博客。

chihiro1122的博客 320

c++组合和继承的区别

若在逻辑上A 是B 的“一部分”(a part of),则不允许B 继承A 的功能,而是要用A和其它东西组合出B。例如眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是头(Head)的一部分,所以类Head 应该由类Eye、Nose、Mouth、Ear 组合而成,不是派生而成。(1)若在逻辑上B 是A 的“一种”(a kind of ),则允许B 继承A 的功能。如男人(Man)是人(Human)的一种,男孩(Boy)是男人的一种。

weixin_41199566的博客 219
上一篇: C++ 智能指针
下一篇: 设计模式——单例模式和工厂模式
蓬莱道人
博客等级 码龄11年 766粉丝 274原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值