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

时间:2013-03-27 14:08:26

标签: c++ constructor abstract-class

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

然而,术语"摘要"也可以认为只是对课程目的的一般描述。 要求每一个这样的抽象概念都是非常奇怪的。 class只需要一个纯虚方法。如果这个课没有任何意义怎么办?你必须引入一个完全不相关的pv方法,只是为了将类标记为' abstract' ..通过将ctors标记为受保护,你可以确保你的class-without-pure-virtuals也是不能自由地创造。

对mainterance的影响也很小:假设你有一个绝对抽象的类,有一些虚拟方法和一个纯虚拟方法。你把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并通过'类型'来检测它们的类型。标志,然后手动转换它们..没有RTTI,没有vtable,非常轻的对象。有时你需要它。

因此,在保护它们方面有一些好处,但这种收益是......好吧,小。