高分 讨论 ...........继承,多重继承,组合.......... 大牛留步

敬畏者 2014-04-03 02:50:32
加精
在继承被打压,多重继承被严厉打压的环境下

希望讨论一下,组合比继承优秀的地方.

只要说出1点,并且确实存在,那么就100分

不够了加分


类A为 被使用的类

在类B中要使用类A,并对外提供一些功能.

类B可以继承类A来使用(继承),也可以包含一个类A的成员变量(组合)

那么 组合比继承强在哪里?


我先说一点
在组合中,可以使用类A指针,在运行时决定使用类A的某个继承实现,灵活的多态方便使用.
...全文
4956 91 打赏 收藏 转发到动态 举报
写回复
用AI写文章
91 条回复
切换为时间正序
请发表友善的回复…
发表回复
rageangle 2014-10-14
  • 打赏
  • 举报
回复
学到了
乄灬释 2014-09-01
  • 打赏
  • 举报
回复
记得当时学习的时候 老师 是这么告诉我们的 我也一直是这么觉得:本质的东西用继承,可有可无的用组合(不是这个东西必备,就像键盘、鼠标不是电脑必备)。
alwaysalex 2014-06-13
  • 打赏
  • 举报
回复
学习了,特意去了解了一下组合和继承,组合是存在在另一个类对象中的对象,继承要复杂一些
  • 打赏
  • 举报
回复
有明显语意的地方用继承,继承相关性比较强,比如一个软件通用的界面风格,肯定继承了。一个页面,具体的页面,实现不同页面的差异化功能,那就是组合一下基本属性使用组合。组合页面本身也是使用到了继承的属性。公共类继承的属性要求设计者技术比较高,很多地方有很明显语意用组合还是继承的,只有少部分地方需要进行选择。
song314 2014-05-12
  • 打赏
  • 举报
回复
引用 92 楼 feitianhu213 的回复:
[quote=引用 69 楼 song314 的回复:] 没注意看,这是C++ 讨论区,不过相比思路都是差不多的,各位应该大致能看懂。。
你这种组合的方法确实是比较高明,而且很灵活,但是这里只是细分了继承,因此继承也是功不可没。感觉就是把一部汽车所有的零件拆开来,然后根据需要,加工(继承)特定的零件,再利用这些零件组装(组合)成一部汽车。这样子细分之后,造出来的汽车也就更加健壮了。受教了,以前还没想过这个层次的划分及细化。顶一个。[/quote] 看起来差不多,都是为了复用代码,核心的要点就在于深入理解has-a 和 is-a,以及继承和多态的利用。推荐你一本讲设计模式的书《Heard First 设计模式》。
飞天狐213 2014-05-12
  • 打赏
  • 举报
回复
引用 93 楼 song314 的回复:
[quote=引用 92 楼 feitianhu213 的回复:] [quote=引用 69 楼 song314 的回复:] 没注意看,这是C++ 讨论区,不过相比思路都是差不多的,各位应该大致能看懂。。
你这种组合的方法确实是比较高明,而且很灵活,但是这里只是细分了继承,因此继承也是功不可没。感觉就是把一部汽车所有的零件拆开来,然后根据需要,加工(继承)特定的零件,再利用这些零件组装(组合)成一部汽车。这样子细分之后,造出来的汽车也就更加健壮了。受教了,以前还没想过这个层次的划分及细化。顶一个。[/quote] 看起来差不多,都是为了复用代码,核心的要点就在于深入理解has-a 和 is-a,以及继承和多态的利用。推荐你一本讲设计模式的书《Heard First 设计模式》。[/quote] 谢谢了,Head First 系列的书真的非常不错,我之前看过它们出版的一本:servlet & JSP 感觉讲的很好,深入浅出,生动灵活
飞天狐213 2014-04-29
  • 打赏
  • 举报
回复
引用 18 楼 u013573183 的回复:
鉴于有人说不能比较,那我举一个例子,是用组合好还是继承好

struct 基本信息
{
	int Age;
	string Name;
};

struct 基本行为
{
	void PlayGame();
	void Work();
};

class 人 :基本信息
{
public:
	基本行为 基本行为;
};
用来组成人的一部分,怎么好
这个在语义上是 has-a 的关系,应该用组合,但这个不能说明什么问题。继承与组合各有各的用处
飞天狐213 2014-04-29
  • 打赏
  • 举报
回复
引用 69 楼 song314 的回复:
没注意看,这是C++ 讨论区,不过相比思路都是差不多的,各位应该大致能看懂。。
你这种组合的方法确实是比较高明,而且很灵活,但是这里只是细分了继承,因此继承也是功不可没。感觉就是把一部汽车所有的零件拆开来,然后根据需要,加工(继承)特定的零件,再利用这些零件组装(组合)成一部汽车。这样子细分之后,造出来的汽车也就更加健壮了。受教了,以前还没想过这个层次的划分及细化。顶一个。
鸥翔鱼游1 2014-04-28
  • 打赏
  • 举报
回复
看了此贴菜鸟又涨姿势了
ojc520520 2014-04-17
  • 打赏
  • 举报
回复
坐等答案。
觉浅2020 2014-04-16
  • 打赏
  • 举报
回复
大部分人都忽视了最重要面向对象思想的本质。继承作为面向对象的基石,是不能替代的,也是组合不能比较的。
l5250926 2014-04-15
  • 打赏
  • 举报
回复
学习学习!!!
^8^ 2014-04-15
  • 打赏
  • 举报
回复
坐等大牛...
beautyangus 2014-04-14
  • 打赏
  • 举报
回复
引用 65 楼 qianbang1 的回复:
[quote=引用 32 楼 beautyangus 的回复:] 个人觉得,不提倡使用多继承主要是这2个方面: 1.多继承带来的结构混乱 并不是每个人都能够很好地理解和使用多继承,这倒不是因为水平问题,主要还是个人习惯,有的人不习惯使用多继承,他们会认为,单继承能够解决的问题没必要使用多继承。 多继承中“子类->父类”的转换和“父类->子类”的转换规则复杂而多变,不单单在使用上容易混淆,甚或是很多人,包括很多擅于使用多继承的人都不愿意去了解底层的工作机制。 而且,多继承里如何处理同名函数、如何正确无误地重载函数都是需要大量经验和失败的教训来归纳总结的。 2.多继承带来的类成员函数指针(下称MFP)的混乱 这是一个最大的通病,不同的多继承环境、不同的编译器对多继承下MFP的处理方式各不相同,这造成了代码移植的困难,也给了许多回调环境设计造成了障碍。 其实,怎么说呢,多继承还是一个非常不错的语言特性,它为我们整体的架构设计带来了更多的可能和更多变的结构方式,合理地去利用一下还是不错的呢!
您好,请问您工作多久了。[/quote] 这个嘛,很是不久!你懂得。
_serendipity_ 2014-04-13
  • 打赏
  • 举报
回复
继承关系的耦合度太大了,组合关系如果使用接口的话,耦合度还是比较小的。实际开发中,适合组合的“has-a”关系比继承的"is-a"关系更多,所以组合用得多。很多人在该用“has-a”的时候用了“is-a”,导致了不恰当的紧耦合。所以很多书就干脆说“组合优于继承”了。
super晓 2014-04-12
  • 打赏
  • 举报
回复
了解需求再合理分析方法
tzp19910827 2014-04-12
  • 打赏
  • 举报
回复
说说我的理解,我是java程序员。第一,在java中是单继承,单继承有限制,不好扩展。第二,组合的好处是可以将可变的东西封装起来,委托别人实现,就是所谓的策略模式。只需要注入自己需要的东西,继承的话就会继承到很多不适合的东西。第三,根据spring的思想,减少侵入式的设计,那么组合的运用可以面向接口编程,而实际的实现可以更换。而继承会导致你依赖特定的api或框架。第四,组合更好设计分层次的代码结构吧。理解不深,大家探讨~~~~
测试一下 2014-04-12
  • 打赏
  • 举报
回复
哪种实际用多了
^8^ 2014-04-11
  • 打赏
  • 举报
回复
学习.........
盘子饿了 2014-04-11
  • 打赏
  • 举报
回复
不管是继承还是组合,有一点需要注意的就是要符合实际,例如,汽车类和轮胎类,就需要选择组合而不选择继承,球类和篮球类,就要选择继承而不是组合。至于楼主说的继承被打压,本人不完全赞同,我觉得被打压的只应该是不合理的继承,合理的继承可以简化代码并且使代码变得更加灵活和符合现实,不合理的继承会使代码结构混乱,不利于维护。 综上,我不认为组合和继承有什么强弱好坏之分,重要是根据具体问题来衡量。 仅代表个人观点。
加载更多回复(71)

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧