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

Mas*_*Man 6 c++ inheritance

我需要设置一个类继承结构,其中抽象基类只保存成员变量(但没有成员方法).成员方法将由派生类定义.因此,我需要的是这篇文章:在没有任何纯虚方法的情况下创建一个类抽象

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

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

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

我在这里搜索了一些帖子的答案(是否有用于使受保护的析构函数虚拟?,C++:受保护的类构造函数,抽象类'析构函数应该是纯虚拟的吗?)尝试将某些东西放在一起,但我不能得出结论.

Tad*_*pec 3

主要区别在于

Base * ptr = new Derived;
delete ptr;
Run Code Online (Sandbox Code Playgroud)

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