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

use*_*951 13 c++ inheritance protected

公共继承很容易.

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

私人继承也很容易,但毫无意义

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

然后我们有保护继承.

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

有没有人有一些样本案例,人们使用受保护的继承以良好的模式(和良心)实际生产用途?

Arn*_*rtz 16

私人继承也很容易,但毫无意义

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

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

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

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

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

一旦您理解了私有继承的继承,保护继承的原因就非常简单:

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

  • 当然,您已经错过了私有继承的最常见原因:基类使用模板方法模式提供可自定义的实现,您必须覆盖其虚函数. (4认同)
  • 更不用说有时,您实现特定接口的事实是您的客户的实现细节.GUI小部件是GUI事件监听器的事实仅涉及小部件本身(以及它为事件设置的位置). (4认同)

Jam*_*nze 5

保护继承的主要动机是正交性.在所有其他环境中,您有三种不同的访问控制:私有,受保护和公共.为什么继承会有所不同?在实践中,人们可以争辩说,一般来说,没有必要或使用受保护的访问.这可能会夸大案件,但可以肯定的是,保护比私人或公共更少.

此外,私有继承并非毫无意义,实际上,它对应于继承的原始用法.只要执行实现的基类使用派生类必须重载的虚函数,就不能使用包含.