6

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

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

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

我很想知道这两种方法之间的区别。是否存在一种应该优先于另一种的情况(或者可能是一些特殊情况,一种可以工作但另一种不行)?我想了想,什么也想不出来。

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

4

2 回答 2

3

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

于 2012-12-05T09:23:57.043 回答
3

主要区别在于

Base * ptr = new Derived;
delete ptr;

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

于 2012-12-05T10:26:06.517 回答