受保护遗产的实际用途是什么

What is the practical use of protected inheritance?

本文关键字:是什么 遗产 受保护      更新时间:2023-10-16

公共继承很容易。

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

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

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

那么我们就保护了遗产。

有人能向我解释一下这到底是干什么的吗?有人说这是一种"作为一种关系"。我还是不太清楚。

有人有一些例子吗,人们以良好的模式(和良知)使用受保护的遗产来进行实际的生产用途?

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

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

你可能看不到私人继承的理由,但这并不意味着它毫无意义。私人继承有几个原因。您是对的,乍一看,私有继承意味着has-a关系就像聚合一样,并且私有继承具有(稍微)更紧密的耦合。

支持私人继承而非侵略的原因可能有以下几点:

  • 通过私有继承,您也可以继承typedef。在某些情况下(例如traits类),私有继承只是在基类中重新typedef的替代方法
  • 在极少数情况下,您必须在之前初始化成员;真实的";(即公共)基类。实现这一点的唯一方法是使该成员成为在公共基类之前继承的私有基类
  • 有时您需要访问某个成员的受保护成员。如果不能更改成员类本身,则必须使用私有继承来访问它们
  • 如果一个成员没有自己的数据成员,它仍然会占用空间。将其作为私有基类可以优化空基类,从而减小类对象的大小
  • 关于更多的观点,请参阅下面詹姆斯的评论

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

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

如果您有理由私下继承某些东西,并且希望使派生类可以访问这些好处(即类或typedefs的潜在成员),请使用受保护的继承。显然,私有继承不应该被使用,保护继承更应该被使用

受保护继承的主要动机是正交性。在所有其他上下文中,您有三种不同的访问控制:私人的、受保护的和公共的。为什么要继承不同的在实践中,人们可能会争辩说没有必要或者通常用于受保护的访问。这可能有些言过其实是的,但可以肯定的是,比私人的或公共的。

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