受保护的继承有什么实际用途?

时间:2013-11-28 09:03:39

标签: c++ inheritance protected

公共继承很容易。

答:公共B意味着每个A都是B.在大多数编程语言中,如vb.net和objective-c,这是唯一的继承类型。

私人继承也很容易但没有意义

A:私人B意味着A由B实现。但是,这是毫无意义的,因为这意味着A应该包含B.所有权意味着更少的耦合,没有缺点。

然后我们保护了继承。

任何人都可以向我解释这到底是为了什么?有人说这是“作为一种关系”。我还不是很清楚。

是否有人有一些示例案例,其中人们以良好的模式(和良心)使用受保护的继承以实际生产用途?

2 个答案:

答案 0 :(得分:14)

  

私人继承也很容易但没有意义

     

A:私人B意味着A由B实现。但是,这是毫无意义的,因为这意味着A应该包含B.所有权意味着更少的耦合,没有缺点。

你可能没有看到私人继承的原因并不意味着它毫无意义。 有几种情况下私人继承有其原因。你是对的,乍一看,私有继承意味着有一个像聚合一样的关系,私有继承有一个(稍微)更紧密的耦合。

支持私人继承而不是侵略的原因可能是以下一些原因:

  • 使用私有继承,您也可以继承typedef。在某些情况下(例如traits类),继承privatly只是在基类中重新输入大量typedef的替代方法。
  • 在很少情况下,您必须在“真实”(即公共)基类之前初始化成员。实现这一目标的唯一方法是使该成员成为在公共基础之前继承的私有基类。
  • 有时您需要访问成员的受保护成员。如果您无法更改成员类本身,则必须使用私有继承来访问它们。
  • 如果某个成员没有自己的数据成员,它仍会占用空间。使其成为私有基类可以实现空基类优化,从而缩小类对象的大小。
  • 了解更多观点,请参阅James的评论

这些原因显然是技术原因,有些人甚至会说“黑客”。但是,存在这样的原因,所以私有继承并非完全没有意义。它不是“纯粹的OO风格” - 但C ++也不是纯粹的OO语言。

一旦你理解了私有继承的原因,保护继承的原因就很简单了:

如果您有理由私下继承某些内容,希望使这些好处(即您的类的成员或typedef)可以被派生类访问,请使用protected inheritance。显然,应该几乎不使用私有继承,并且更加保护继承。

答案 1 :(得分:5)

受保护继承的主要动机是正交性。 在所有其他上下文中,您有三种不同的访问控制: 私人,受保护和公共。为什么要继承 不同?在实践中,人们可以争辩说没有必要 或者一般用于受保护的访问。这可能是夸大其词 这种情况,但可以肯定的是,受到的保护要少得多 私人或公共。

此外,私人继承并非毫无意义,事实上, 对应于继承的原始用法。一旦到了 执行实现的基类使用虚函数 派生类必须重载,不能使用包含。