您的位置:首页 > 编程语言 > C语言/C++

C++ 编程思想——继承和组合

2013-01-19 20:53 615 查看
缺省是Private继承。

构造函数初始化表达式表允许显式调用成员对象的构造函数。

内置类型可以像是有单个构造函数的对象一样初始化。如 int i; i(123);但它并不是真的有构造函数。

构造函数调用顺序: 先调用基类构造函数,然后调用成员对象构造函数。成员函数构造函数调用顺序按声明顺序。
析构函数调用顺序: (和构造函数相反)

名字隐藏:在派生类中重定义的函数名会掩盖所有基类版本。

非自动继承的函数:构造/析构函数不能被继承,operator = 也不能被继承。

继承和组合都能把子对象放在新类中,都使用构造函数的初始化表达式去构造子对象。
is-a用继承表达,has-a用组合表达。
继承也就是取一个已存在的类,并制作它的一个专门的版本。

对viod指针调用delete,它只释放内存而不调用析构函数。

用组合还是继承,判断方法之一是确认:是否需要新类向上映射。

任何向上映射都会损失对象的类型信息。

***************《面向对象之继承和组合浅谈》*********************

from: /article/4696916.html

最近一个师弟问某实现是该用对象持有(其实就是组合)还是集成关系实现好。所以就在这里简单的浅谈一下,仅是个人观点,仅供参考。如果写的不对的地方请指出。

首先它们都是实现系统功能重用,代码复用的最常用的有效的设计技巧,都是在设计模式中的基础结构。相信大家已了解的,类继承允许我们根据自己的实现来覆盖重写父类的实现细节,父类的实现对于子类是可见的,所以我们一般称之为白盒复用。对象持有(其实就是组合)要求建立一个号的接口,但是整体类和部分类之间不会去关心各自的实现细节,即它们之间的实现细节是不可见的,故成为黑盒复用。

继承是在编译时刻静态定义的,即是静态复用,在编译后子类和父类的关系就已经确定了。而组合这是运用于复杂的设计,它们之间的关系是在运行时候才确定的, 即在对对象没有创建运行前,整体类是不会知道自己将持有特定接口下的那个实现类。在扩展方面组合比集成更具有广泛性。

继承中父类定义了子类的部分实现,而子类中又会重写这些实现,修改父类的实现,设计模式中认为这是一种破坏了父类的封装性的表现。这个结构导致结果是父类实现的任何变化,必然导致子类的改变。然而组合这不会出现这种现象。

对象的组合还有一个优点就是有助于保持每个类被封装,并被集中在单个任务上(类设计的单一原则)。这样类的层次结构不会扩大,一般不会出现不可控的庞然大 类。而累的继承就可能出来这些问题,所以一般编码规范都要求类的层次结构不要超过3层。组合是大型系统软件实现即插即用时的首选方式。

在设计模式中这两个概念同时出现的地方就是Adapter模式:对象适配(组合)和类适配(继承)。一般我们提倡用对象适配而不是类适配。基于上面的原 因。还有就是在我们的Java和.NET这些完全面向对象的语言而言类的继承是单继承,取消了C++等的多继承。下面放两个这两种方式的UML图:

类适配图:





对象适配图:





最后还说一句,“优先使用对象组合,而不是继承”是面向对象设计的第二原则。但并不是说什么都设计都用组合,只是优先考虑组合,更不是说继承即使不好的设计,应该用组合,应为他们之间也有各自的优势。下面是他们之间的优缺点比比较表:

组 合 关 系

继 承 关 系

优点:不破坏封装,整体类与局部类之间松耦合,彼此相对独立

缺点:破坏封装,子类与父类之间紧密耦合,子类依赖于父类的实现,子类缺乏独立性

优点:具有较好的可扩展性

缺点:支持扩展,但是往往以增加系统结构的复杂度为代价

优点:支持动态组合。在运行时,整体对象可以选择不同类型的局部对象

缺点:不支持动态继承。在运行时,子类无法选择不同的父类

优点:整体类可以对局部类进行包装,封装局部类的接口,提供新的接口

缺点:子类不能改变父类的接口

缺点:整体类不能自动获得和局部类同样的接口

优点:子类能自动继承父类的接口

缺点:创建整体类的对象时,需要创建所有局部类的对象

优点:创建子类的对象时,无须创建父类的对象

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: