社区
C++ 语言
帖子详情
一般什么时候用类的组合,什么时候用类的继承
huhaifengasd
2012-02-19 06:53:38
如题 C++新手、求解释
...全文
1157
25
打赏
收藏
一般什么时候用类的组合,什么时候用类的继承
如题 C++新手、求解释
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
25 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
cxyOOOO
2012-02-22
打赏
举报
回复
继承偏重集体,具有特殊性的集体(派生类)可以看作是一般性集体(基类)的一部分,如汽车对于交通工具。
组合偏重个体,某个功能对象被宿主对象看成自己的一部分,如轮子对于汽车。
与看待事物的角度有关,继承偏抽象,组合偏具体。
pathuang68
2012-02-21
打赏
举报
回复
Boy说得很好。一般情况下,除非必要,通常的原则是优先考虑使用组合
coding_leezam
2012-02-21
打赏
举报
回复
见书:effective c++,more effective c++,exceptional c++,组合就是has,继承是is,
Wolf0403
2012-02-21
打赏
举报
回复
[Quote=引用 13 楼 pengzhixi 的回复:]
引用 12 楼 loaden 的回复:
引用 9 楼 supermegaboy 的回复:
这里说的“实现”指的是类对象的内存映象,方法指的是成员函数。
这句没看懂,求教?
他说的实现就是指数据成员
[/Quote]
那不就更是错的了?对于 private 数据成员来说,组合和继承都无法访问,关键点根本不在这里么。
支持英文数字
2012-02-21
打赏
举报
回复
简单的说,组合是指有一个,继承是指是一个。
qscool1987
2012-02-21
打赏
举报
回复
[Quote=引用 13 楼 pengzhixi 的回复:]
引用 12 楼 loaden 的回复:
引用 9 楼 supermegaboy 的回复:
这里说的“实现”指的是类对象的内存映象,方法指的是成员函数。
这句没看懂,求教?
他说的实现就是指数据成员
[/Quote]
数据成员也能称为实现?实现和方法如何还能有区别?
我的理解:组合体现为实现层面,继承主要体现在扩展方面
我觉得如果并不是需要一个类的所有东西(包括接口和属性),那么就不需要用继承,相反就用组合。
用继承那就必须是所有的都继承,不是所有的都继承,那么就是滥用继承。
pengzhixi
2012-02-21
打赏
举报
回复
[Quote=引用 12 楼 loaden 的回复:]
引用 9 楼 supermegaboy 的回复:
这里说的“实现”指的是类对象的内存映象,方法指的是成员函数。
这句没看懂,求教?
[/Quote]
他说的实现就是指数据成员
「已注销」
2012-02-21
打赏
举报
回复
[Quote=引用 9 楼 supermegaboy 的回复:]
这里说的“实现”指的是类对象的内存映象,方法指的是成员函数。[/Quote]
这句没看懂,求教?
Wolf0403
2012-02-21
打赏
举报
回复
[Quote=引用 9 楼 supermegaboy 的回复:]
当你需要它的实现而非方法的时候,应使用继承;当你需要它的方法而非实现的时候,应使用组合;
这里说的“实现”指的是类对象的内存映象,方法指的是成员函数。
[/Quote]
更模糊了。
不管是
struct A : B {}
还是
struct A { B m_b; }
通过组合和继承你都是将一个 B 类对象完整地嵌入一个 A 类对象中。唯一不同的是,通过继承,A 类对象得到了 B 类的所有公开接口供外界调用,而组合的时候,A 的公开接口并没有发生变化。
zzcmx2008
2012-02-21
打赏
举报
回复
dahaiI0
2012-02-21
打赏
举报
回复
马那个克,慢慢消化,高手好多啊
mosal
2012-02-21
打赏
举报
回复
Model "has-a" or "is-implemented-in-terms-of" through composition
Use private inheritance judiciously
FrankHB1989
2012-02-21
打赏
举报
回复
[Quote=引用 14 楼 qscool1987 的回复:]
引用 13 楼 pengzhixi 的回复:
引用 12 楼 loaden 的回复:
引用 9 楼 supermegaboy 的回复:
这里说的“实现”指的是类对象的内存映象,方法指的是成员函数。
这句没看懂,求教?
他说的实现就是指数据成员
数据成员也能称为实现?实现和方法如何还能有区别?
我的理解:组合体现为实现层面,继承主要体现在扩展方面
我觉得如果并不是需要一……
[/Quote]
private数据成员就算实现,PImpl除外。
由于PImpl,组合在编译依赖和不同版本的运行时兼容性上优于继承;由于mixin,继承在合理复用实现的潜力优于组合。两者的合理使用都需要经验积累,不过感觉用好mixin比用好PImpl难许多。
最终还是看需求决定。
FrankHB1989
2012-02-21
打赏
举报
回复
不是所有的继承是“是一个”。public继承才是“是一个”。
组合在外部来看近似private继承,除了继承可以使用虚函数。如果不使用虚函数一般优先考虑组合以免各种隐式使用基类成员闪瞎眼;不过继承有时候可以少写不少代码,反而更清楚。
铁文
2012-02-21
打赏
举报
回复
类之间有三种关系:is-a;has-a,用-实现;
is-a;has-a的关系从逻辑上通常很好区分,此处不谈。
现在假设,A类要使用B类实现一些操作;此时,可以使用私有继承和组合,那么到底选用哪个呢?
标准答案是优先使用组合,因为它具有更好的封装性,应变能力强。
但是,当B涉及多态或其它特殊理由的时候(比如,B是一个结构,并明确要求需要对A进行B的切片),就必须使用私有继承。
飞天御剑流
2012-02-20
打赏
举报
回复
[Quote=引用 7 楼 wolf0403 的回复:]
引用 6 楼 supermegaboy 的回复:
可以给你一个适用于多数情况(但非绝对)的原则:
当你需要它的实现而非方法的时候,应使用继承;当你需要它的方法而非实现的时候,应使用组合;
无论什么时候,组合应比继承优先考虑,因为继承有损松散耦合度。
啥叫实现,啥叫方法?没看懂。。
[/Quote]
这里说的“实现”指的是类对象的内存映象,方法指的是成员函数。
飞天御剑流
2012-02-20
打赏
举报
回复
[Quote=引用 5 楼 jenicooper 的回复:]
尽量用组合。
[/Quote]
尽量用组合是错的,应该说优先考虑组合。
Wolf0403
2012-02-20
打赏
举报
回复
[Quote=引用 6 楼 supermegaboy 的回复:]
可以给你一个适用于多数情况(但非绝对)的原则:
当你需要它的实现而非方法的时候,应使用继承;当你需要它的方法而非实现的时候,应使用组合;
无论什么时候,组合应比继承优先考虑,因为继承有损松散耦合度。
[/Quote]
啥叫实现,啥叫方法?没看懂。。
飞天御剑流
2012-02-20
打赏
举报
回复
可以给你一个适用于多数情况(但非绝对)的原则:
当你需要它的实现而非方法的时候,应使用继承;当你需要它的方法而非实现的时候,应使用组合;
无论什么时候,组合应比继承优先考虑,因为继承有损松散耦合度。
jenicooper
2012-02-19
打赏
举报
回复
尽量用组合。
加载更多回复(4)
初学者python笔记(类的
继承
与多态—详解)
文章目录一、类的
组合
与
继承
的区别二、类的
继承
1、
继承
的功能分析2、类的
继承
之派生、接口
继承
3、用接口模块abc来实现接口
继承
4、使用接口
继承
的好处5、类的
继承
顺序6、在子类中调用父类的方法三、多态的相关思想 本篇是关于面向对象再进一步深入的内容,是上篇文章:初学者python笔记(静态属性、类方法、静态方法、类的
组合
)的后续篇,主要分析了类的
继承
、类的派生、类的接口
继承
、多态,这是面向对象编程较重要的一块内容 一、类的
组合
与
继承
的区别 上篇文章分析了类的
组合
,那么什么时候用
继承
,什么时候用
组合
? 用
组合
:当类之间有显著不同,并且较小的类是较大的类所需要的组件时 用
继承
:当类之间有很多相同的功能
Python面向对象之
继承
和
组合
用法实例分析
本文实例讲述了Python面向对象之
继承
和
组合
用法。分享给大家供大家参考,具体如下: 面向对象的
组合
用法 软件重用的重要方式除了
继承
之外还有另外一种方式,即:
组合
组合
指的是,在一个类中以另外一个类的对象作为数据属性,称为类的
组合
圆环是由两个圆组成的,圆环的面积是外面圆的面积减去内部圆的面积。圆环的周长是内部圆的周长加上外部圆的周长。 这个时候,我们就首先实现一个圆形类,计算一个圆的周长和面积。然后在”环形类”中
组合
圆形的实例作为自己的属性来用 # -*-coding:utf-8 -*- #! python3 from math import pi class Circle: '''
PHP设计模式之适配器模式原理与用法分析
本文实例讲述了PHP设计模式之适配器模式原理与用法。分享给大家供大家参考,具体如下: 一、什么是适配器模式 适配器模式有两种:类适配器模式和对象适配器模式。其中类适配器模式使用
继承
方式,而对象适配器模式使用
组合
方式。由于类适配器模式包含双重
继承
,而PHP并不支持双重
继承
,所以一般都采取结合
继承
和实现的方式来模拟双重
继承
,即
继承
一个类,同时实现一个接口。类适配器模式很简单,但是与对象适配器模式相比,类适配器模式的灵活性稍弱。采
用类
适配器模式时,适配器
继承
被适配者并实现一个接口;采用对象适配器模式时,适配器使用被适配者,并实现一个接口。 二、什么时候使用适配器模式 适配器模式的作用就是解决兼容性问
【C++】
继承
和
组合
的概念?什么时候用
继承
?什么时候用
组合
?
继承
:通过扩展已有的类来获得新功能的代码重用方法
组合
:新类由现有类的对象合并而成的类的构造方式何时用
继承
?何时用
组合
?1.如果二者间存在一个“是”的关系,并且一个类要对另外一个类公开所有接口,那么
继承
是更好的选择2.如果二者间存在一个“有”的关系,那么首选
组合
ps:没有找到极其强烈无法辩驳的使用
继承
的利用的时候,一律采用
组合
组合
体现为现实层面,
继承
主要体现在扩展方面如果并不是需要一个类的...
24.什么时候使用
组合
,什么时候使用
继承
------一二熊猫
组合
组合
关系概述 实现类的复用除了
继承
外,还可以使用
组合
的方式,把该类当成另一个类的
组合
成分,从而允许新类直接复用该类的public方法。 不管
继承
还是
组合
,都允许在新类(对于
继承
就是子类)中直接复用旧类的方法。
组合
是把旧类对象作为新类的成员变量
组合
起来,用以实现新类的功能,用户看到的是新类的方法,而不能看到被
组合
对象的方法。因此,通常要在新类里使用private修饰被
组合
的旧类对象。
组合
和
继承
从类的复用角度看,父类的功能等同于
组合
中被
组合
的类,都将自身的方法提供给新类使用;子类和
组合
关系里的整体类
C++ 语言
65,212
社区成员
250,518
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章