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)的一部分,所以类Head应该由类Eye、Nose、Mouth、Ear组合而成,不是派生而成
3.继承的优点和缺点
 优点:
 容易进行新的实现,因为其大多数可继承而来。
 易于修改或扩展那些被复用的实现。
 缺点:
 破坏了封装性,因为这会将父类的实现细节暴露给子类。
“白盒”复用,因为父类的内部细节对于子类而言通常是可见的。
 当父类的实现更改时,子类也不得不会随之更改。
 从父类继承来的实现将不能在运行期间进行改变。
4.组合的优点和缺点
 优点:
 容器类仅能通过被包含对象的接口来对其进行访问。
“黑盒”复用,因为被包含对象的内部细节对外是不可见。
 封装性好。
 实现上的相互依赖性比较小。(被包含对象与容器对象之间的依赖关系比较少)
 每一个类只专注于一项任务。
 通过获取指向其它的具有相同类型的对象引用,可以在运行期间动态地定义(对象的)组合。
 缺点:
 导致系统中的对象过多。
 为了能将多个不同的对象作为组合块(composition block)来使用,必须仔细地对接口进行定义。
5.两者的选择
is-a关系用继承表达,has-a关系用组合表达
继承体现的是一种专门化的概念而组合则是一种组装的概念
另外确定是组合还是继承,最清楚的方法之一就是询问是否需要新类向上映射,也就是说当我们想重用原类型作为新类型的内部实现的话,我们最好自己组合,如果我们不仅想重用内部实现而且还想重用接口的话,那就用继承。
6.法则:优先使用(对象)组合,而非(类)继承

个人理解:组合耦合度小,容易扩展,继承耦合度太大了,应该优先使用组合,而非继承。

时间: 2024-12-06 13:33:31

c++ 继承和组合的区别的相关文章

<Java中的继承和组合之间的联系和区别>

1 //Java中的继承和组合之间的联系和区别 2 //本例是继承 3 4 class Animal 5 { 6 private void beat() 7 { 8 System.out.println("心胀跳动..."); 9 } 10 public void breath() 11 { 12 beat(); 13 System.out.println("吸一口气,吐一口气,呼吸中..."); 14 } 15 } 16 //继承Animal,直接复用父类的bre

Inheritance, Association, Aggregation, and Composition 类的继承,关联,聚合和组合的区别

在C++中,类与类之间的关系大概有四种,分别为继承,关联,聚合,和组合.其中继承我们大家应该都比较熟悉,因为是C++的三大特性继承Inheritance,封装Encapsulation,和多态Polymorphism之一. 继承Inheritance:是指一个类(子类)来继承另一个类(基类),并增加自己的功能,可以通过重写基类中的函数来实现.可以将继承理解成“IS A”的关系,比如A cat "IS A" animal, or A car "IS A" vehicl

Java中的继承与组合

本文主要说明Java中继承与组合的概念,以及它们之间的联系与区别.首先文章会给出一小段代码示例,用于展示到底什么是继承.然后演示如何通过“组合”来改进这种继承的设计机制.最后总结这两者的应用场景,即到底应该选择继承还是组合. 1.继承 假设我们有一个名为Insect(昆虫)的类,这个类包含两个方法:1)移动move(): 2)攻击attack(). 代码如下: class Insect { private int size; private String color; public Insect

Java中的继承与组合(转载)

本文主要说明Java中继承与组合的概念,以及它们之间的联系与区别.首先文章会给出一小段代码示例,用于展示到底什么是继承.然后演示如何通过“组合”来改进这种继承的设计机制.最后总结这两者的应用场景,即到底应该选择继承还是组合. 1.继承 假设我们有一个名为Insect(昆虫)的类,这个类包含两个方法:1)移动move(): 2)攻击attack().代码如下: class Insect { private int size; private String color; public Insect(

面向对象的继承与组合

面向对象的优势在于类的复用.继承与多态都是对类进行复用,它们是一个类级别的复用,一个是方法级别的复用.提到继承必提组合,二者有何异同?PHP到底有没有多态?若没有,则为什么没有?有的话,和其他语言中的多态又有什么区别? 继承和组合都是提高代码可重用性的手段.在设计模型时,可以按照语言识别类之间的组合关系和继承关系. 从方法复用的角度考虑,如果两个类中有很多相同的代码和方法,可以从这两个类中抽象出一个父亲,提供公共方法,然后两个类作为子类,提供个性方法. 这时继承语义更好. 而组合就没有这么多限制

继承与组合

本文主要说明Java中继承与组合的概念,以及它们之间的联系与区别.首先文章会给出一小段代码示例,用于展示到底什么是继承.然后演示如何通过"组合"来改进这种继承的设计机制.最后总结这两者的应用场景,即到底应该选择继承还是组合. 1.继承 假设我们有一个名为Insect(昆虫)的类,这个类包含两个方法:1)移动move(): 2)攻击attack().代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 2

Objective-C基础1:OC中类的继承和组合

1.类的定义和声明 OC中的类声明是以@interface开始@end结束. OC中的类定义以@implementation开始@end结束. OC中的方法声明: - (void) setName : (NSString*) strName;前面的短线-表示这是一个方法,(void)表示返回值, setName表示方法名称,(NSString*) StrName表示参数是NSString*类型,名称是strName,注意:()一定要加 OC中的成员变量定义在类声明的{}中,这一点跟方法声明不一样

[Think In Java]基础拾遗1 - 对象初始化、垃圾回收器、继承、组合、代理、接口、抽象类

目录 第一章 对象导论第二章 一切都是对象第三章 操作符第四章 控制执行流程第五章 初始化与清理第六章 访问权限控制第七章 复用类第九章 接口 第一章 对象导论 1. 对象的数据位于何处? 有两种方式在内存中存放对象: (1)为了追求最大的执行速度,对象的存储空间和生命周期可以在编写程序时确定,这可以通过将对象置于堆栈或者静态存储区域内来实现.这种方式牺牲了灵活性. (2)在被称为堆的内存池中动态地创建对象.在这种方式,知道运行时才知道对象需要多少对象,它们的生命周期如何,以及它们的具体类型.

java的继承和组合

继承和组合是java中非常常用的两种创建新类型的方法,两者都能提高代码的复用率. 继承主要是想让子类继承父类的基本特性:组合技术通常用于想在新类中使用现有类的功能,而非它的接口.两者的分别是"IS A"和"HAS A"的关系 继承: class Shape { public void draw() { System.out.println("draw a shape"); } public void erase() { System.out.pr