受保护的构造函数与纯虚拟析构函数

时间:2012-12-05 09:05:06

标签: c++ inheritance

我需要设置一个类继承结构,其中抽象基类只保存成员变量(但没有成员方法)。成员方法将由派生类定义。因此,我需要的是这篇文章:Making a class abstract without any pure virtual methods

从那里的前两个答案,我意识到有两种方法可以实现它:

  • 使析构函数纯虚拟。
  • 使构造函数受到保护。

我很想知道这两种方法之间的区别。是否存在一个应该优先于另一个的情况(或者某些特殊情况,其中一个可以工作而不是另一个)?我想到了,无法想到任何事情。

我在这里搜索了一些帖子(Is there a use for making a protected destructor virtual?C++: Protected Class ConstructorShould an abstract class' destructor be pure virtual?)的答案,试图将某些内容放在一起,但我无法得出结论。

2 个答案:

答案 0 :(得分:3)

通过利用完全不同的机制,两种方式都能达到预期的效果。在我看来,protected constructor更具表现力,因为它与您的问题描述完全一致。 Pure virtual destructor不是一个自然的解决方案,可能需要额外的文档来解释其目的。它也会强制子类实现析构函数,即使它可以被跳过。

答案 1 :(得分:3)

主要区别在于

Base * ptr = new Derived;
delete ptr;

使用虚拟析构函数是合法的,没有它就会有UB。此外dynamic_cast至少需要一个虚函数 因此,如果您想要多态行为,请使用(纯)虚拟析构函数。如果您不想要它,请使用受保护的构造函数,并且不要为多态性(vtables)支付开销。但是然后声明析构函数也受到保护,以防止通过基指针删除。