0

我在某处读到抽象基类的构造函数应该受到保护?为什么这是一种推荐的做法,如果不加以保护,怎么会被滥用?

4

2 回答 2

1

如果您认为这是推荐的做法,您应该询问实际推荐此做法的人。C++中的抽象类是一个至少有一个纯虚函数的类。编译器无论如何都不会让您创建此类的实例,并且使用受保护的构造函数来帮助它没有多大意义。这是基于您提供的信息,作者可能有原因但您可能误解了这个概念。

于 2013-03-27T14:19:00.897 回答
1

我相信该建议的重点是假设分析、核心可读性和维护性。

在 C++ 中,如果您的类中有任何纯虚方法,那么它被认为是抽象的并且自动不可实例化。为此不需要受保护的ctors/dtors。有一些功夫方法可以创建像抽象类对象这样的东西,但如果你知道如何做到这一点,那就是你的范式问题:)

然而,术语“抽象”也可以被认为只是对类目的的一般描述。要求每个这样的“抽象”类只需要一个纯虚方法是很奇怪的。如果它对该类没有任何意义怎么办?您必须引入一个完全不相关的 pv 方法才能将类标记为“抽象”。通过将 ctor 标记为受保护,您可以确保您的类没有纯虚拟也不能自由创建。

对维护的影响也很小:假设您有一个绝对抽象的类,其中包含一些虚拟方法和一个纯虚拟方法。您将 ctors/dtors 公开。然后,在半年之后,您修补/升级/修改该类,并将纯虚拟更改为非“纯”,并具有一些默认实现。哎呀。现在您的课程可以创建了。[为了人为的例子,我故意忽略了纯虚拟可以实现的事实]。

当然,完全另一个问题是 - 这种没有虚拟方法的抽象基础有什么用?除了构建基于标志的半多态性之外,我找不到使用示例:

struct Base { protected: base(){} public: int type; }
struct Derived1:Base { derived1(){type=1;} int shoesize; string codename; }
struct Derived2:Base { derived2(){type=2;} string name, family; }

您可以通过基指针传递derived1/2 并通过'type'标志检测它们的类型,然后手动转换它们......没有RTTI,没有vtable,非常轻的对象。有时你需要它。

因此,使它们受到保护有一些好处,但这种好处是……嗯,很小。

于 2013-03-27T14:24:55.483 回答