曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 2474|回复: 0
打印 上一主题 下一主题

使用包含还是私有继承?

[复制链接]

716

主题

734

帖子

2946

积分

超级版主

Rank: 9Rank: 9Rank: 9

积分
2946
跳转到指定楼层
楼主
发表于 2013-12-13 11:10:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Q :使用包含还是私有继承

A :包含 和 私有继承都可以建立 has-a 关系。大多数 C++ 程序员倾向于使用“包含”。原因是,“包含” 关系易于理解。在“包含”中,类声明里包含了显示命名对象,代码可以通过名称引用这些对象;而使用“私有继承”,使得关系变得很抽象。其次,继承会引起许多问题,尤其从多个基类继承时,可能需要处理许多问题,如包含同名方法的独立的基类或共享祖先的独立基类。然而,使用“包含“就不太可能遇到这些麻烦。另外,包含能够包括多个同类的子对象。比如,某个类需要 3 个 string 对象,那么可以使用包含声明 3 个独立的 string 成员,而继承只能使用一个这样的对象(当对象都没有名称时,将难以区分)。

然而,私有继承却可以提供比“包含”更多的特性。例如,假设类包含保护成员(可以是数据成员,也可以是成员函数),这样的成员在派生类中是可用的,但在继承层次结构外不可用。如果使用“组合”将这样的类包含在另一个类中,则或者将不是派生类,而是位于继承层次结构之外,因此不能访问保护成员。但通过继承的方式,得到的是派生类,这样是能够访问保护成员的。

另一种需要使用私有继承的情况是,需要重新定义虚函数。派生类可以重新定义虚函数,但包含类不能。使用私有继承,重新定义的函数只能在类中使用,而不是公有的。

一点经验是,通常,应使用“包含”来建立 has-a 关系;如果新类需要访问原有类的保护成员,或需要重新定义虚函数,则应使用私有继承。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-21 07:36 , Processed in 0.074372 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表