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

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

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

>使析构函数纯粹虚拟.
>使构造函数受到保护.

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

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

最佳答案
主要区别在于

Base * ptr = new Derived;
delete ptr;

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

转载注明原文:c – 受保护的构造函数与纯虚拟析构函数 - 代码日志