何时在抽象类 cpp 中声明受保护字段

Posted

技术标签:

【中文标题】何时在抽象类 cpp 中声明受保护字段【英文标题】:When to declare protected fields in abstract class cpp 【发布时间】:2020-01-12 05:29:06 【问题描述】:

我对抽象类的概念感到非常不舒服,如果有人能把它说得更清楚一点,我会很高兴。我确实理解这也是实施和个人风格的问题,但我希望在尝试解决问题时至少有一些指导方针可供考虑。

我认为抽象类只代表其派生类将继承的一种行为。因为我们不能从抽象类类型实例化一个对象,所以如果它们有一个 c'tor 或任何数据字段,它们应该处于保护模式。今天遇到一段代码,其中抽象类有一个公共构造函数,这让我更加困惑。我对此有几个问题:

    抽象类的唯一独特之处是它们具有纯虚函数?这是阻止我从此类实例化对象的唯一原因

    在什么情况下我想在抽象类中声明受保护的字段?什么时候添加受保护的构造函数有用?什么时候需要公共构造函数?

我看到了抽象类的许多不同用途,但有时我会想到完全不同的解决方案,大多数时候这比所提出的要复杂和麻烦。

感谢大家的时间和关注。

【问题讨论】:

【参考方案1】:

当您想为某些东西提供基本实现时,请使用抽象类,将实现的某些部分留给子类,但必须强制实现缺少的部分。

抽象类唯一的独特之处是它们具有纯虚函数?

一个类是抽象的,因为它的某些部分(方法)也是抽象的(没有实现)。

但是,即使类没有抽象方法,您也可以将其声明为抽象类。那就是你想阻止人们实例化它。 (在这种情况下,您也可以声明构造函数受保护)

在什么情况下我想在抽象类中声明受保护的字段?

在同一场合,您会为任何类声明受保护的字段:一些可能被子类使用的属性

什么时候添加受保护的构造函数有用?

当您想防止类的对象实例化时。如果类是抽象的,则没有额外的好处,因为它无论如何都不是无形的。

什么时候需要公共构造函数?

对于抽象类,它不是。但这是有效的。然后子类将使用该构造函数从它们自己的构造函数传递参数。在抽象类的情况下,它可以被声明为受保护而没有任何副作用。

请注意,我不是 C++ 专家,但这些问题适用于任何 OOP 语言。

【讨论】:

以上是关于何时在抽象类 cpp 中声明受保护字段的主要内容,如果未能解决你的问题,请参考以下文章

PHP抽象类详解

为啥Java抽象类中需要受保护的构造函数

为啥你不能在 Java 中有一个受保护的抽象类?

PHP抽象类与接口的区别

使用 PHPUnit 测试受保护方法的最佳实践(在抽象类上)

PHP抽象类与接口的区别