受保护的抽象基类的构造函数和析构函数

Constructors and Destructors of abstract base class as protected?

本文关键字:析构函数 构造函数 基类 抽象 受保护      更新时间:2023-10-16

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

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

我认为这个建议的重点是假设,核心可读性和维护。

在c++中,如果你的类中有任何纯虚方法,那么它被认为是抽象的并且自动地不可实例化。不需要受保护的医生。有一些功夫的方法来创建类似抽象类的对象,但如果你知道如何做,那是你的范式问题:)

然而,术语"抽象"也可以被认为只是类目的的一般描述。如果要求每个这样的"抽象"类都必须需要一个纯虚方法,那将是非常奇怪的。如果它对这个类没有任何意义呢?你必须引入一个完全无关的p-v方法,只是为了将类标记为"抽象"。通过将这些变量标记为protected,您可以确保您的-class-without-pure-virtuals也不能自由创建。

对维护也有很小的影响:假设你有一个绝对抽象的类,它有一些虚方法和一个纯虚方法。你让医生/医生公开。然后,半年之后,你修补/升级/修改类,你改变纯虚拟不"纯",并有一些默认的实现。哎呦。现在你的类是可创建的。[我故意忽略了纯虚拟可以有实现这一事实]。

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

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,没有变量表,非常轻的物体。有时候你需要它。

因此,保护它们是有好处的,但这种好处是……嗯,小。